none
SQLSever2005のクエリー文 RRS feed

  • 質問

  •   こんにちは。

    SQLServer2005のクエリー文を、教えて下さい。

    KMK,COD,JUNの3列のテーブルがあります。

    このテーブルをKMK毎にCODの値をJUNの並びで横に集計したいのです。

    複数あった場合は1つのみです。

    例えば

    KMK    COD  JUN

    A       ああ   1

    A       ああ   1

    A      いい       2

    A     うう         3

    A     うう     3

    B   ああ   1

    とあった場合

    A    ああ  いい  うう

    B   ああ

    とデータを取得したいのです。

    解る方おられましたら、どのようなクエリーになるのでしょうか?

    宜しくお願いします。

    2013年8月9日 5:24

すべての返信

  • クエリ―を実行したとして、その結果はどのように得るのでしょうか? 通常であればカラム名が KMK、COD、JUN など事前に決まっていますが…。

    一応、方法としてはちょうどSQL Server 2005で導入されたPIVOTが使えそうです。

    2013年8月9日 6:44
  • 私の場合 MySQL を基本的に使ってますので group_concat ならすぐ浮かびますが、SQL Server ならどう対応するのだろうと調べてみたら幾つか記事が見つかりました。

    SQLServer 2005 でgroup_concat

    Simulating group_concat MySQL function in Microsoft SQL Server 2005?

    これらの記事を基にすると以下のようなクエリになりそうです(未検証)

    SELECT
       KMK
      ,(
        SELECT
          sub.COD + ' '
        FROM
          TABLEA sub
        WHERE
          sub.KMK = TABLEA.KMK
        FOR XML PATH('')
      ) AS name_concat
    FROM
      TABLEA
    GROUP BY KMK

    もっともSQL Server は門外漢のため、より優れた回答を頂けると思いますが、一応参考までに上げておきます。

    ひらぽん http://d.hatena.ne.jp/hilapon/



    • 編集済み ひらぽん 2013年8月9日 7:08 group by が抜けてたので修正
    2013年8月9日 6:59
  • 普通にPIVOTを使うだけでは無理っぽいので、まず、KMK、COD毎に連番を振る必要がありそうです。

    (参考)
    列カラムの値をTop行で横展開方法
    http://social.msdn.microsoft.com/Forums/ja-JP/89f18f17-3593-4e8c-88cb-ddef1fadb9e1/top

    でも、ひょっとして、「A    ああ  いい  うう」は、1つの列に格納される文字列なのでしょうか? であれば、XMLを書き出すSQLを応用すれば可能です。


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

    2013年8月9日 7:08
  •  回答ありがとうございます。

    クエリーの結果は、

    A    ああ  いい  うう

    B   ああ

    の2行の取得となります。(KMKで集計する為)

    SELECT KMK,

     MAX(CASE WHEN JUN = 1 THEN COD ELSE '' END) AS COD1, 

     MAX(CASE WHEN JUN = 2 THEN COD ELSE '' END) AS COD2,

     MAX(CASE WHEN JUN = 3 THEN COD ELSE '' END) AS COD3

    FROM

    (SELECT KMK,COD,ROW_NUMBER() OVER (PARTITION BY KMK ORDER BY JUN)

    順位付けし,CASE文で横にして見ました。

    これだと、JUNが増えると大変です。

    2013年8月9日 8:42