次のような 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
行 ( EMAIL
、PRINT 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 ステートメントで定義する必要がある条件が増えることです。
これも対処できるため、準備されたステートメント、ルーチン、カウンターなどを使用する傾向があります。
このトピックに関する追加リンク: