none
データ抽出用SQL文の質問です RRS feed

  • 質問

  • お世話になります。

    初歩の質問ですが、よろしくお願いいたします。

    環境:SQL SERVER 2005

    テーブル情報:

    品種 保留フラグ
    A1 1
    A1 NULL
    A2 1
    A2 1
    A2 NULL
    A3 1
    A3 1
    A4 NULL
    A4 NULL
    A4 NULL

    ※保留フラグ 1 :または NULL

    上記のテーブルから、下記のフォーマットでデータを抽出したいです。

    ↓↓↓↓↓

    品種 流動中 保留中
    A1 1 1
    A2 1 2
    A3   2
    A4 3  

    ※データがない時に、空白にしたいですが・・・(可能であれば、"0"の表示仕方も教えてほしいです。)

    一発SQL文を発行したいですが、ヒントを教えて頂けないでしょうか。よろしくお願いいたします。

    2014年7月18日 9:50

回答

  • 質問者のレベル感と分かりやすさを考えるに GROUP BY でも良いかなぁ、と個人的には思います。
    以下のような感じですね。

    SELECT
    品種,
    COUNT(CASE WHEN 保留フラグ IS NULL THEN 1 END) 流動中,
    COUNT(保留フラグ) 保留中
    FROM テーブル
    GROUP BY 品種

    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク kentkent_jp 2014年7月20日 1:43
    2014年7月18日 18:11

すべての返信

  • 例示だけでなく、もう少しきちんと説明できませんか? 流動中 の値の数え方、保留中の数え方。

    でその次のステップとして、数え方を具体的なSQL文にはできますか? つまり

    品種 流動中
    A1 1
    A2 1
    A4 3

    という表と

    品種 保留中
    A1 1
    A2 2
    A3 2

    という表です。

    それができれば2つの表を結合するだけです。説明できるところまで説明し、分からない部分を質問してください。

    ※データがない時に、空白にしたいですが・・・(可能であれば、"0"の表示仕方も教えてほしいです。)

    どこに表示したいのかの説明がありません。そのような状態では答えようがありません。

    2014年7月18日 10:31
  • 佐祐理さんの指摘はもっともなのですが、とりあえず一般論を書いておきますので、これを元にトライできるのではないかと思います。

    さて、藤森さんもご紹介されているPIVOTですが、以下をご紹介しておきます。PIVOTを使った方がスマートにできると思いますので、PIVOTについて調べてみて下さい。

    PIVOTで遊ぶ
    http://blogs.wankuma.com/kaya/archive/2006/09/24/39459.aspx

    また、データが無い時、すなわちNULLを0に置き換えるのは、ISNULL関数、もしくはCOALESCE関数を使用します。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年7月18日 14:55
  • 質問者のレベル感と分かりやすさを考えるに GROUP BY でも良いかなぁ、と個人的には思います。
    以下のような感じですね。

    SELECT
    品種,
    COUNT(CASE WHEN 保留フラグ IS NULL THEN 1 END) 流動中,
    COUNT(保留フラグ) 保留中
    FROM テーブル
    GROUP BY 品種

    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク kentkent_jp 2014年7月20日 1:43
    2014年7月18日 18:11
  • 確かにPIVOTはある程度慣れが必要だと思いますし、まずは基本のGROUP BYをしっかり押さえる方が筋ですね。
    PIVOTの例を載せておきます。

    SELECT 品種, [0] 流動中, [1] 保留中
    FROM
    (
        SELECT 品種, isnull(保留フラグ, 0) 保留フラグ FROM テーブル
    ) T
    PIVOT
    (
        count(保留フラグ) FOR 保留フラグ IN ( [0], [1] )
    ) AS T;


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    • 編集済み trapemiya 2014年7月19日 3:13 追記
    2014年7月19日 3:12
  • 目的達成しました、ご返答有難うございました。

    もうちょっと深く考えてみたほうがよかったと思います・・・

    勉強となりました、有難うございました。

    2014年7月20日 1:53
  • たくさんのご返答有難うございます。

    Excelでピボットテーブル良く使いますね・・・

    PIVOT と UNPIVOT の演算子を使用できるように練習します。

    2014年7月20日 2:08