これは基本的にあるピボットテーブル。
これを達成する方法についての素晴らしいチュートリアルはここにあります: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
-statement を使用することをかなり叫びます。何かによってグループ化するためには、よく、使用... 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ステートメントで定義する必要のある条件が増えます。
これも対処できるため、人々は準備されたステートメント、ルーチン、カウンターなどを使用する傾向があります。
このトピックに関するいくつかの追加リンク: