1

問題がある。私はこれを持っています:

コード | 番号
-------------
|1
|2
|3
b |3
b |4

次のようにする必要があります。

| | b
----------
1 | 3
2 | 4
3 | ヌル

今、私はこの解決策を持っています:

SELECT CASE Code WHEN 'a' THEN Number END AS a,
    CASE コード WHEN 'b' THEN 数値 END AS b
FROM tableCN

しかし、それは私にこれを与えます:

| | b
----------
1 | ヌル
2 | ヌル
3 | ヌル
null | null | 3
null | null | 4

もちろん、実際のテーブルにはもっと多くのコードと数字があります。

誰かアドバイスがあれば教えてください。どんな助けにも感謝します!
お時間をいただきありがとうございます。

更新 1:

すごい!PIVOT関数を見たことがない。しかし、コードをハードコードしました:

( MAX(Number) FOR Code IN ([a],[b]))
.

試みる:

( MAX(Number) FOR Code IN (
コードを選択
  FROM テストテーブル
  コードでグループ化
)))

私は何が起こっているのか全く理解していないと思います =(

4

1 に答える 1

1

アイデアは PIVOT を使用することですが、テーブルに一意のキーがないため、ROW_NUMBER() でレコード セットを出力できるようにキーを生成する必要があります。

この例では動的に行いますhttp://sqlfiddle.com/#!3/8c592/20 :

  DECLARE @SQL NVARCHAR(MAX)

  DECLARE @Pivot NVARCHAR(MAX)

  SELECT @Pivot = (SELECT 
                     DISTINCT '['+CODE +'],'
                  FROM
                    tblTest
                  FOR XML PATH(''))



  SET @SQL = '
              SELECT 
                pvt.a, pvt.b
              FROM
                (SELECT Code, Number, ROW_NUMBER() OVER (Partition BY code ORDER BY Number) rn FROM tblTest)
                 tblTest
              PIVOT
                ( MAX(Number) FOR Code IN ('+LEFT(@Pivot,LEN(@Pivot)-1)+'))
                PVT
              '

  EXEC sp_Executesql @statement = @SQL

このコードはそれを行います、http://sqlfiddle.com/#!3/8c592/11 :

 SELECT 
     rn,pvt.*
 FROM
    (
      SELECT Code, Number, ROW_NUMBER() OVER (Partition BY code ORDER BY Number) rn 
      FROM tblTest
     )
   tblTest
PIVOT
  ( MAX(Number) FOR Code IN ([a],[b]))
PVT

これは、正確な出力に一致するコードですhttp://sqlfiddle.com/#!3/8c592/14 :

  SELECT 
    pvt.a, pvt.b
  FROM
    (   
       SELECT Code, Number, ROW_NUMBER() OVER (Partition BY code ORDER BY Number) rn 
       FROM tblTest
    )
     tblTest
  PIVOT
    ( MAX(Number) FOR Code IN ([a],[b]))
    PVT
于 2012-11-16T09:52:28.383 に答える