2つのテーブルを結合して、日ごとの利用者の内訳を集計するSQL構文について、質問します。
前提
tbl_classは、講習の日付(年、月、日)と講習種別(A~C)を定義しています。
tbl_studentは、受講者の情報を定義していて、講習で使った機材(PC、スマホ、紙)の区別を収納しています。
【tbl_class】(簡略化しています)
c_id|c_year|c_month|c_day|c_category
110 2022 5 19 A
111 2022 5 20 C
112 2022 5 20 B
113 2022 5 23 A
114 2022 5 23 A
115 2022 5 24 B
116 2022 5 24 A
【tbl_student】(簡略化しています)
s_id|s_class_id|s_type
1 110 PC
2 110 スマホ
3 110 紙
4 111 スマホ
5 111 紙
6 111 PC
7 111 PC
8 112 紙
9 112 スマホ
10 113 紙
11 113 PC
12 113 スマホ
13 114 PC
14 114 PC
15 114 紙
16 114 紙
17 114 PC
12 115 紙
13 115 紙
14 116 PC
15 116 スマホ
16 116 紙
17 116 PC
実現したい事
c_idとs_class_idを結合のキーとして、機材「PC・スマホ」と
「紙」の使用者数を日ごとに集計したいです。
ただし、c_category「C」は集計しないものとします。
【期待する結果】
年 | 月 | 日 | PC・スマホ | 紙
2022 5 19 2 1
2022 5 20 1 1
2022 5 23 5 3
2022 5 24 3 3
実践したこと
以下のSQLで講習ごとの集計はできたのですが、日ごとの集計がままなりません。
【SQL実行結果】
年 | 月 | 日 | PC・スマホ | 紙
2022 5 19 2 1
2022 5 20 1 1
2022 5 23 2 1
2022 5 23 3 2
2022 5 24 0 2
2022 5 24 3 1
SQL
1SELECT DISTINCT 2 c_year, 3 c_month, 4 c_day, 5 PC・スマホ, 6 紙 7FROM 8 tbl_class 9 INNER JOIN( 10 SELECT 11 count(CASE WHEN s_type IN('PC','スマホ') THEN 1 ELSE NULL END) as 'PC・スマホ', 12 count(CASE WHEN s_type IN('紙') THEN 1 ELSE NULL END) as '紙', 13 s_class_id 14 FROM 15 tbl_student 16 GROUP BY s_class_id 17 ) as student 18ON 19 c_id = s_class_id 20WHERE 21 c_category not IN('C') 22ORDER BY c_year,c_month,c_day
独学の初学者ゆえ基本なことも身についておりませんが、今後も学習は続けていきたいと思っております。
どなたか、ご教授の程お願いいたします。
補足
windows10
SQL Server Express(14.0.1000.169)
SQL Server Management Studio(14.0.17289.0)
回答1件
あなたの回答
tips
プレビュー