[解決済み】MySQLでピボットテーブルの出力を返すには?
質問
MySQLのテーブルが以下のようなものであった場合。
会社名 アクション ページ数 ------------------------------- A社 PRINT 3 A社 PRINT 2 A社 PRINT 3 B社 EMAIL B社 PRINT 2 B社 PRINT 2 B社PRINT1 A社 PRINT 3
MySQLのクエリを実行して、このような出力を得ることは可能でしょうか。
会社名 EMAIL PRINT 1 ページ PRINT 2 ページ PRINT 3 ページ ------------------------------------------------------------- 会社名A 0 0 1 3 B社 1 1 2 0
という考え方です。
pagecount
が変化するため、出力カラムの量もそれを反映したものにする必要があります。
action
/
pagecount
のペアを作成し、各ペアのヒット数
company_name
. これはピボットテーブルと呼ばれるかどうかわかりませんが、誰かがそれを提案したのでしょうか?
どのように解決するのですか?
これは基本的に は ピボット・テーブル
これを実現するための素敵なチュートリアルが、ここにあります。 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 文で定義する条件が増えることです。
これも、プリペアドステートメントやルーチン、カウンタなどを使って対処することが多いですね。
このトピックに関するいくつかの追加リンク。
関連
-
MySQLとのPython統合でAttributeErrorが発生する: モジュール 'socket' には 'AF_UNIX' という属性がない
-
[解決済み] mysqladmin: 'localhost'のサーバーへの接続に失敗しました。
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] データフレームをピボットするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】autoカラムは1つしか存在できない
-
[解決済み】MySQLユーザーDBにパスワードカラムがない - OSXへのMySQLインストール
-
[解決済み】「docker container run」は最低1つの引数を必要とする
-
[解決済み] SQLZOO - select from world チュートリアル #13
-
[解決済み] MySQLで週単位でグループ化する方法は?
-
[解決済み] JDBC経由でMySQLにUTF-8を挿入しようとすると、"不正な文字列値 "と表示される?
-
[解決済み] MYSQLのTIMESTAMP比較
-
[解決済み] エラーコードです。1215. 外部キー制約を追加できません (外部キー)
-
[解決済み] mysqlのテーブルからユニークキーを削除する方法
-
[解決済み] テーブルがクラッシュしたと判定されたため、修復する必要があります。