2

私はこのようなテーブルの結果を壊してマージしようとしています。(ビンゴの場合!)最初の文字で列を分割するのに十分簡単に​​CASEを書くことができます。ただし、行がIDによって区別されるものとして扱われるため、nullが表示されることになります。ここでいくつかのマージ例を試しましたが、困惑しているようです。IDは重要ではなく、初期データの収集方法を制御できます。

ID  |  Number     |
====================
1   |      N6     | 
2   |      B22    |
3   |      B5     |
4   |      I9     |
5   |      N4     |


B  |  I  |  N  |  G  |  O  |
============================
B5 |  I9 | N4  |  -- | --  |
B22| --  | N6  |  -- | --  |
4

2 に答える 2

3
;WITH CTE AS
(
SELECT *,
       LEFT([Number],1) AS Letter,
       ROW_NUMBER() OVER (PARTITION BY LEFT([Number],1) 
                              ORDER BY CAST(SUBSTRING([Number],2,2) AS INT) ) AS RN
FROM Table1
)
SELECT 
    MAX(CASE WHEN Letter = 'B' THEN [Number] END) AS B,
    MAX(CASE WHEN Letter = 'I' THEN [Number] END) AS I,
    MAX(CASE WHEN Letter = 'N' THEN [Number] END) AS N,
    MAX(CASE WHEN Letter = 'G' THEN [Number] END) AS G,
    MAX(CASE WHEN Letter = 'O' THEN [Number] END) AS O
FROM CTE
GROUP BY RN

SQLフィドル

于 2013-01-28T21:55:33.143 に答える
1

このタイプのデータ変換はピボットです。データを回転させる方法はいくつかあります。

集計の場合:これは、case式と集計関数を使用して列を作成します

select 
  max(case when letter = 'b' then number end) B,
  max(case when letter = 'i' then number end) I,
  max(case when letter = 'n' then number end) N,
  max(case when letter = 'g' then number end) G,
  max(case when letter = 'o' then number end) O
from
(
  select left(number, 1) letter,
    number,
    row_number() over(partition by left(number, 1) 
                     order by cast(substring(number, 2, 2) as int)) rn
  from yourtable
) src
group by rn
order by rn

SQL FiddlewithDemoを参照してください

ピボット:

または、SQL Server 2005以降を使用しているため、次のPIVOT関数を使用できます。

select b, i, n, g, o
from
(  
  select left(number, 1) letter,
    number,
    row_number() over(partition by left(number, 1) 
                      order by cast(substring(number, 2, 2) as int)) rn
  from yourtable
) src
pivot
(
  max(number)
  for letter in (b, i, n, g, o)
) piv

SQL FiddlewithDemoを参照してください

于 2013-01-28T21:55:48.123 に答える