C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

条件を使った COUT の使用方法

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■92081 / inTopicNo.1)  条件を使った COUT の使用方法
  
□投稿者/ 韋駄天 (17回)-(2019/08/23(Fri) 11:49:57)

分類:[データベース全般] 

SQLServer を使用しています。
以下の Table_A, Table_B のテーブルがある場合に、

Table_A
CODE
A
B
C

Table_B
ST CODE ST
1 A 1
2 A 2
3 B 3
4 B 2
5 B 3
6 C 1

ST の値それぞれのカウント(個数)を求める
Table C
CODE ST1 ST2 ST3
A  1 1 0
B  0 1 2
C  1 0 0

この場合以下のようにするしかないのでしょうか?

SELECT CODE,
    (
    SELECT COUNT(*)
    FROM  Table_B
    WHERE  ST = 1
    ) AS ST1,
    (
    SELECT COUNT(*)
    FROM  Table_B
    WHERE  ST = 2
    ) AS ST2,
    (
    SELECT COUNT(*)
    FROM  Table_B
    WHERE  ST = 3
    ) AS ST3,
FROM  Table_A

それとも

SELECT CODE, COUNT(TB.ST = 1) AS ST1, COUNT(TB.ST = 2) AS ST2, COUNT(TB.ST = 3) AS ST3
FROM  Table_A AS TA
LEFT OUTER JOIN Table_B AS TB
 ON TB.CODE = TA.CODE

のようにできるのでしょうか?
(参照:https://qiita.com/zb185423/items/f20b21ca041989410b5f






引用返信 編集キー/
■92082 / inTopicNo.2)  Re[1]: 条件を使った COUT の使用方法
□投稿者/ PANG2 (316回)-(2019/08/23(Fri) 12:51:02)
COUNT(ST=1 OR null) はエラーになるので、iif関数を使ってみました。

SELECT
CODE,
COUNT(iif(ST=1, 1, null)) AS ST1,
COUNT(iif(ST=2, 1, null)) AS ST2,
COUNT(iif(ST=3, 1, null)) AS ST3
FROM TableB
GROUP BY CODE
ORDER BY CODE

参考
https://www.softel.co.jp/blogs/tech/archives/3267
引用返信 編集キー/
■92083 / inTopicNo.3)  Re[1]: 条件を使った COUT の使用方法
□投稿者/ 魔界の仮面弁士 (2317回)-(2019/08/23(Fri) 12:52:00)
No92081 (韋駄天 さん) に返信
> 以下の Table_A, Table_B のテーブルがある場合に、
Table_B に ST 列が 2 つあるような…?
とりあえず、Table_B の先頭列は、ID という列名の主キーと読み替えておきます。


> この場合以下のようにするしかないのでしょうか?
余剰カンマや全角空白は、掲示板投稿時の綾かと思いますが、その SQL だと

CODE, ST1, ST2, ST3
A, 1, 1, 0
B, 0, 1, 2
C, 1, 0, 0

ではなく、

CODE, ST1, ST2, ST3
A, 2, 2, 2
B, 2, 2, 2
C, 2, 2, 2

になってしまうことでしょう。
求める結果を獲るためには、提示された SQL の
(
 SELECT COUNT(*)
 FROM Table_B
 WHERE ST = 1
) AS ST1,
などの行にある WHERE 句を
 WHERE Table_B.ST = 1 AND Table_B.CODE = Table_A.CODE
に差し替える必要がありますね。


(別案1)

WITH Table_W AS (SELECT CODE, ST, COUNT(*) AS CNT
FROM Table_B GROUP BY CODE, ST
) SELECT Table_A.CODE
, ST1 = SUM(CASE Table_W.ST WHEN 1 THEN Table_W.CNT ELSE 0 END)
, ST2 = SUM(CASE Table_W.ST WHEN 2 THEN Table_W.CNT ELSE 0 END)
, ST3 = SUM(CASE Table_W.ST WHEN 3 THEN Table_W.CNT ELSE 0 END)
FROM Table_A LEFT JOIN Table_W ON Table_A.CODE = Table_W.CODE
GROUP BY Table_A.CODE


(別案2)

SELECT CODE, [1] AS ST_1, [2] AS ST_2, [3] AS ST_3 FROM (
SELECT Table_A.CODE, Table_B.ID, Table_B.ST
FROM Table_A LEFT JOIN Table_B ON Table_A.CODE = Table_B.CODE
) AS X PIVOT (COUNT(ID) FOR ST IN ([1], [2], [3]) ) AS Y
引用返信 編集キー/
■92091 / inTopicNo.4)  Re[1]: 条件を使った COUT の使用方法
□投稿者/ shu (1190回)-(2019/08/24(Sat) 07:33:22)
No92081 (韋駄天 さん) に返信

CODEでグループ化しSTでPIVOTすればなんとかなるきがします。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ