ホームページ >データベース >mysql チュートリアル >GROUP_CONCAT を使用して MySQL でデータをピボットし、動的列ヘッダーを処理する方法
MySQL PIVOT/CROSSTAB QUERY
データ分析では、多くの場合、データを垂直形式から水平形式に変換する必要があります。ピボットまたはクロス集計として。 MySQL では、これはさまざまな手法を使用して実現できます。
ピボット テーブルの作成
質問 1: 次の列を含むテーブルについて考えてみましょう。 app_id、transaction_id、mobile_no、node_id、customer_attribute、およびentered_value。タスクは、app_id、transaction_id、mobile_no でグループ化されたピボット テーブルを作成し、node_id の値が列ヘッダーになり、対応する Entered_value がセルに表示されるようにすることです。
答え: これGROUP_CONCAT を使用して実現できます。 function:
SELECT app_id, transaction_id, mobile_no, GROUP_CONCAT(CASE WHEN node_id = 1 THEN entered_value ELSE NULL END) AS Q1, GROUP_CONCAT(CASE WHEN node_id = 2 THEN entered_value ELSE NULL END) AS Q2, GROUP_CONCAT(CASE WHEN node_id = 3 THEN entered_value ELSE NULL END) AS Q3, GROUP_CONCAT(CASE WHEN node_id = 4 THEN entered_value ELSE NULL END) AS Q4, GROUP_CONCAT(CASE WHEN node_id = 5 THEN entered_value ELSE NULL END) AS Q5 FROM trn_user_log GROUP BY app_id, transaction_id, mobile_no;
NAME_CONST の使用
質問 2: user_input1、user_input2 などを列ヘッダーとして使用する代わりに、に保存されている値を使用しますcustomer_attribute.
回答: これは NAME_CONST 関数を使用して実現できますが、指定された引数が正しくないためにエラーが発生しました:
SELECT app_id, transaction_id, mobile_no, NAME_CONST(customer_attribute, (CASE WHEN node_id = 1 THEN entered_value ELSE NULL END)) FROM trn_user_log;
この関数は定数を予期しています2 番目の引数の値なので、変更が必要です:
SELECT app_id, transaction_id, mobile_no, CASE node_id WHEN 1 THEN NAME_CONST(customer_attribute, entered_value) ELSE NULL END AS customer_attribute FROM trn_user_log;
以上がGROUP_CONCAT を使用して MySQL でデータをピボットし、動的列ヘッダーを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。