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

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

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

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

Q&A

解決済

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

junejuly
junejuly

総合スコア2

SQL

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

2回答

0グッド

1クリップ

223閲覧

投稿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のユニーク値は時間とともに増えていくため、自動で横軸が増えていく方法を模索しております。

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

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

yambejp

2022/11/21 08:14

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

2022/11/22 07:42

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

回答2

3

ベストアンサー

プロシージャで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

総合スコア109126

junejuly👍を押しています
spoofy_dragon😍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

junejuly

2022/11/22 07:43

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

1

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

総合スコア16250

junejuly👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2022/11/21 09:08

こちらの回答が他のユーザーから「質問に対する回答となっていない投稿」という指摘を受けました。

回答へのコメント

junejuly

2022/11/22 07:44

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

2022/11/22 21:39

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

SQL

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