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

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

次のような MySQL テーブルがあるとします。

会社名 アクション ページ数
A社 印刷 3
A社 印刷 2
A社 印刷 3
B社 Eメール
B社 印刷 2
B社 印刷 2
B社 印刷 1
A社 印刷 3

MySQL クエリを実行して次のような出力を取得することは可能ですか?

会社名 Eメール 1ページを印刷 2ページを印刷 3ページを印刷
会社A 0 0 1 3
会社B 1 1 2 0

アイデアとしては、 はpagecount変化する可能性があるので、出力列の量はそれを反映する必要があり、各action/pagecountペアごとに 1 つの列、次に ごとのヒット数ですcompany_name。これがピボット テーブルと呼ばれるかどうかはわかりませんが、誰かがそう提案したのでしょうか?

ベストアンサー1

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

これを実現する方法に関する優れたチュートリアルは、こちらにあります: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

行 ( EMAILPRINT x pages) は条件に似ています。主なグループ化は によって行われますcompany_name

条件を設定するために、これはむしろ使用を叫ぶCASE- ステートメント。何かをグループ化するには、 ... を使用します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 ステートメントで定義する必要がある条件が増えることです。

これも対処できるため、準備されたステートメント、ルーチン、カウンターなどを使用する傾向があります。

このトピックに関する追加リンク:

おすすめ記事