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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.92081 の関連記事表示

<< 0 >>
■92081  条件を使った COUT の使用方法
□投稿者/ 韋駄天 -(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





親記事 /過去ログ159より / 関連記事表示
削除チェック/

■92083  Re[1]: 条件を使った COUT の使用方法
□投稿者/ 魔界の仮面弁士 -(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
記事No.92081 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92082  Re[1]: 条件を使った COUT の使用方法
□投稿者/ PANG2 -(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
記事No.92081 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92091  Re[1]: 条件を使った COUT の使用方法
□投稿者/ shu -(2019/08/24(Sat) 07:33:22)
    No92081 (韋駄天 さん) に返信

    CODEでグループ化しSTでPIVOTすればなんとかなるきがします。
記事No.92081 のレス /過去ログ159より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -