sql >> データベース >  >> RDS >> Mysql

MySQLでピボットテーブルの出力を返すにはどうすればよいですか?

    これは基本的に ピボットテーブル。

    これを実現するための優れたチュートリアルは、次の場所にあります。 http:// www.artfulsoftware.com/infotree/qrytip.php?id=78

    この投稿を読んで、このソリューションをニーズに合わせて調整することをお勧めします。

    更新

    上記のリンクが現在利用できなくなった後、ここでmysqlピボットの回答を検索しているすべての人に追加情報を提供する義務があると感じています。本当に膨大な量の情報があり、そこからすべてをここに入れることはしません(彼らの膨大な知識をコピーしたくないので、さらに多く)が、ピボットに対処する方法についてアドバイスしますそもそも質問をしたpekuの例を使用して、SQLの方法を一般的に表にします。

    リンクがすぐに戻ってくるかもしれません。私はそれを監視します。

    スプレッドシートの方法...

    多くの人は、この目的のために、MSExcel、OpenOffice、その他のスプレッドシートツールなどのツールを使用しています。これは有効な解決策です。そこにあるデータをコピーし、GUIが提供するツールを使用してこれを解決してください。

    しかし...これは問題ではありませんでした。データをスプレッドシートに取り込む方法や問題のあるスケーリングなど、いくつかの欠点につながる可能性もあります。

    SQLの方法...

    彼のテーブルは次のようになります:

    CREATE TABLE `test_pivot` (
      `pid` bigint(20) NOT NULL AUTO_INCREMENT,
      `company_name` varchar(32) DEFAULT NULL,
      `action` varchar(16) DEFAULT NULL,
      `pagecount` bigint(20) DEFAULT NULL,
      PRIMARY KEY (`pid`)
    ) ENGINE=MyISAM;
    

    次に、彼/彼女の希望するテーブルを調べます:

    company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
    -------------------------------------------------------------
    CompanyA        0       0               1               3
    CompanyB        1       1               2               0
    

    行( EMAIL PRINTxページ )条件に似ています。主なグループ化はcompany_nameによるものです 。

    条件を設定するために、これは ケース -声明。何かでグループ化するには、... GROUP BYを使用します。 。

    このピボットを提供する基本的なSQLは、次のようになります。

    SELECT  P.`company_name`,
        COUNT(
            CASE 
                WHEN P.`action`='EMAIL' 
                THEN 1 
                ELSE NULL 
            END
        ) AS 'EMAIL',
        COUNT(
            CASE 
                WHEN P.`action`='PRINT' AND P.`pagecount` = '1' 
                THEN P.`pagecount` 
                ELSE NULL 
            END
        ) AS 'PRINT 1 pages',
        COUNT(
            CASE 
                WHEN P.`action`='PRINT' AND P.`pagecount` = '2' 
                THEN P.`pagecount` 
                ELSE NULL 
            END
        ) AS 'PRINT 2 pages',
        COUNT(
            CASE 
                WHEN P.`action`='PRINT' AND P.`pagecount` = '3' 
                THEN P.`pagecount` 
                ELSE NULL 
            END
        ) AS 'PRINT 3 pages'
    FROM    test_pivot P
    GROUP BY P.`company_name`;
    

    これにより、目的の結果が非常に速く提供されます。このアプローチの主な欠点は、ピボットテーブルに必要な行が多いほど、SQLステートメントで定義する必要のある条件が増えることです。

    これも処理できるため、プリペアドステートメント、ルーチン、カウンターなどを使用する傾向があります。

    このトピックに関するいくつかの追加リンク:



    1. 共通フィールドを持たない2つのテーブルを組み合わせる

    2. Oracleで大文字を含む行を見つける4つの方法

    3. PostgreSql INSERT FROM SELECT RETURNING ID

    4. MariaDBでのMONTH()のしくみ