質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

671閲覧

【SQL】縦関係のカラムをピボット集計のように二軸集計をする方法

junejuly

総合スコア2

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2022/11/21 07:59

SQL初心者です。
Excelでいうピボット集計のような集計ができないかと考えておりますが、大変恐れ入りますが、ご教授を頂けますと幸いです。

業務で以下のようなデータソースがあります。

user_idtraffic_soucecreated_at
123456789AAA2022/4/11 0:00
789456123BBB2022/4/12 0:00
563247859CCC2022/4/13 0:00
123456789DDD2022/4/14 0:00
789456123EEE2022/4/15 0:00
563247859AAA2022/4/15 0:00

これを、以下のようなWxcelのピボットテーブルのような形式で出力をしたいと考えています。

user_idAAABBBCCCDDDEEE
12345678910010
78945612301001
56324785910100

固定値で、

SQL

1 SELECT 2 user_id, 3 MAX(CASE user_idWHEN 'AAA' THEN 1 ELSE 0 END) as AAA, 4 MAX(CASE user_idWHEN 'BBB' THEN 1 ELSE 0 END) as BBB, 5 MAX(CASE user_idWHEN 'CCC' THEN 1 ELSE 0 END) as CCC, 6 MAX(CASE user_idWHEN 'DDD' THEN 1 ELSE 0 END) as DDD,

と書けばできそうなことまでは辿り着きましたが、traffic_souceのユニーク値は時間とともに増えていくため、自動で横軸が増えていく方法を模索しております。

大変恐れ入りますが、例文や参考記事など、ヒントを頂けますと大変助かります。。

お忙しい中大変恐れ入りますが、
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/11/21 08:14

SQLの種類とバージョンは何を想定していますか?
junejuly

2022/11/22 07:42

コメントありがとうございます! BigQueryとなります。。!!
guest

回答2

0

ベストアンサー

プロシージャでSQL文を生成するのが妥当ですね

参考

mysqlを利用したprocedure

SQL

1/* 元テーブル */ 2create table tbl 3(user_id int,traffic_souce varchar(10),created_at datetime); 4insert into tbl values 5(123456789,'AAA','2022-04-11 0:00'), 6(789456123,'BBB','2022-04-12 0:00'), 7(563247859,'CCC','2022-04-13 0:00'), 8(123456789,'DDD','2022-04-14 0:00'), 9(789456123,'EEE','2022-04-15 0:00'), 10(563247859,'AAA','2022-04-15 0:00'); 11 12/* プロシージャ作成 */ 13drop procedure if exists proc; 14delimiter // 15create procedure proc () 16begin 17declare a varchar(10); 18declare done int default 0; 19declare cur cursor for 20select distinct traffic_souce from tbl; 21declare continue handler for sqlstate '02000' set done = 1; 22set @sql=''; 23open cur; 24repeat 25fetch cur into a; 26if not done then 27if @sql='' then 28set @sql='select user_id,'; 29else 30set @sql=concat(@sql,','); 31end if; 32set @sql=concat(@sql,'sum(traffic_souce=\'',a,'\') as `',a,'` '); 33end if; 34until done end repeat; 35close cur; 36 37set @sql=concat(@sql,'from tbl '); 38set @sql=concat(@sql,'group by user_id '); 39prepare stmt from @sql; 40execute stmt; 41end 42// 43delimiter ;

実行

SQL

1call proc();

投稿2022/11/21 08:21

編集2022/11/21 08:47
yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junejuly

2022/11/22 07:43

ご丁寧に具体的な記述まで、ありがとうございます!! プロシージャというものがまだわかっていませんので、、勉強してみます!!!
guest

0

SQLはデータベースやバージョンによる方言が大きいです。質問にデータベース、バージョンを明示できると適切なコメントがつき易いです。

Oracle Database LISTAGG 同一キーのデータを横にカンマ区切りで並べる
SQL Server 縦に並んだデータを横にカンマ区切りの列データで取得する方法
SQL Server 2017以降 STRING_AGG
MySQL GROUP_CONCAT
PostgreSQL STRING_AGG
BigQuery ARRAY_AGGやARRAY_TO_STRING

投稿2022/11/21 08:27

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junejuly

2022/11/22 07:44

ご丁寧にありがとうございます! 環境はBigQueryでございました。。!!
Orlofsky

2022/11/22 21:39

同じSQLでもデータベースによる方言が大きいです。 適切な回答ができるように質問に[BigQuery]タグを追加しては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問