お世話になっております。
よろしくお願いします。
やりたいこと
下記①②のような表があったとき、IDごとに特定のNumberのカウントを取得するビュー③を作成したいです。
※①のテーブルではNumber=1~3, ②のテーブルではNumber=12だけカウント
①元テーブル1
ID | Number1 |
---|---|
田中 | 1 |
高橋 | 2 |
高橋 | 4 |
斉藤 | 1 |
斉藤 | 3 |
斉藤 | 3 |
斉藤 | 12 |
②元テーブル2
ID | Number2 |
---|---|
田中 | 3 |
林 | 2 |
林 | 12 |
林 | 12 |
③作成したいビュー
ID | countOf_1 | countOf_2 | countOf_3 | countOf_12 |
---|---|---|---|---|
田中 | 1 | 0 | 0 | 0 |
高橋 | 0 | 1 | 0 | 0 |
斉藤 | 1 | 0 | 2 | 0 |
林 | 0 | 0 | 0 | 2 |
試したこと
IDごとのカウントは下記二つの方法で試してみて、取得できました。
SQL
1※方法1 2SELECT DISTINCT t1.ID, COUNT(*) AS countOf_1 3FROM 元テーブル1 t1 4WHERE t1.Number = 1 5GROUP BY t1.ID; 6※別Numberや元テーブル2の取得はFROM句とWHERE句を変更するだけなので省略します
SQL
1※方法2 2①元テーブル1 3SELECT DISTINCT t1.ID, 4 COUNT(CASE WHEN t1.Number = 1 THEN 'X' ELSE NULL END) AS countOf_1, 5 COUNT(CASE WHEN t1.Number = 2 THEN 'X' ELSE NULL END) AS countOf_2, 6FROM 元テーブル1 t1 7GROUP BY t1.ID; 8 9②元テーブル2 10SELECT DISTINCT t2.ID, 11 COUNT(CASE WHEN t2.Number = 3 THEN 'X' ELSE NULL END) AS countOf_3 12FROM 元テーブル2 t2 13GROUP BY t2.ID;
方法1だと、それぞれで取得した表を一つにまとめることができませんでした。
調べた結果、外部結合で実施できるのだと思いましたが、どう書けばいいかわかりませんでした。
また方法2だと、テーブル1から取得した結果は一つの表にまとめられましたが、テーブル2から取得した結果を結合することができませんでした。
ご教授のほど、よろしくお願いします。
追記
正しい例を提示していませんでした。申し訳ございません。
元テーブル1と元テーブル2のカラム"Number"は実際には違うカラム名となります。
またyambejp様、sazi様のご回答を参考に実行すると結合された表は作成されるのですが、countof_1~4のsum結果が実際と異なってしまいました。
コードを記載します(※また実際と異なるといけないため、条件など実際の環境に合わせたコードを載せています)
SQL
1select coalesce(tbl1.ID, tbl2.ID) as ID 2 , sum(case tbl1.Number1 when 1 then 1 else 0 end) as countOf_1 3 , sum(case tbl1.Number1 when 2 then 1 else 0 end) as countOf_2 4 , sum(case tbl1.Number1 when 3 then 1 else 0 end) as countOf_3 5 , sum(case tbl2.Number2 when 12 then 1 else 0 end) as countOf_12 6from TABLE1 tbl1 full join TABLE2 tbl2 7 on tbl1.ID = tbl2.ID 8 and tbl1.Number1 in (1,2,3) 9 and tbl2.Number2 = 12 10group by coalesce(tbl1.ID, tbl2.ID) 11order by coalesce(tbl1.ID, tbl2.ID);

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/22 02:09
2019/02/22 02:14
2019/02/22 02:25 編集
2019/02/22 02:38
2019/02/22 03:02
2019/02/22 04:02
2019/02/22 04:18
2019/02/22 04:26
2019/02/22 04:52
2019/02/22 05:21