データのピボットを解除してピボットすることで結果を取得できますが、必要row_number()
な順序でデータを保持するために を使用することもできます。
最初のステップは、現在のデータをクエリし、 を適用しrow_number()
て各行の値を取得し、 で分割してとcid
で並べ替えることです。cat1
cat2
select cid, cat1, cat2,
row_number() over(partition by cid order by cat1, cat2) seq
from yourtable
デモを参照してください。データを取得したら、複数の列をアンピボットして、cat1
複数cat2
の行を持つ単一の列にします。UNPIVOT 関数を使用するか、CROSS APPLY を使用してデータを変換できます。
select cid, value
, 'rw'+cast(row_number() over(partition by cid order by col, seq) as varchar(10)) rw
from
(
select cid, cat1, cat2,
row_number() over(partition by cid order by cat1, cat2) seq
from yourtable
) d
cross apply
(
select 1, cat1 union all
select 2, cat2
) c (col, value)
デモを参照してください。データのピボットを解除すると、もう一度適用row_number()
されます。これは、新しい列名の作成に使用されます。今回適用すると、データを で分割しcid
、列cat1
/ cat2
(私は1
/を使用2
しました) と元に作成したシーケンスで並べ替えます。この新しい行番号により、すべての新しい列ヘッダーが作成され、表示したい順序でデータが保持されます。
最後に、PIVOT 関数を適用します。
select cid,
coalesce(rw1, 0) rw1,
coalesce(rw2, 0) rw2,
coalesce(rw3, 0) rw3,
coalesce(rw4, 0) rw4,
coalesce(rw5, 0) rw5,
coalesce(rw6, 0) rw6
from
(
select cid, value
, 'rw'+cast(row_number() over(partition by cid order by col, seq) as varchar(10)) rw
from
(
select cid, cat1, cat2,
row_number() over(partition by cid order by cat1, cat2) seq
from yourtable
) d
cross apply
(
select 1, cat1 union all
select 2, cat2
) c (col, value)
) src
pivot
(
max(value)
for rw in (rw1, rw2, rw3, rw4, rw5, rw6)
) piv;
SQL Fiddle with Demoを参照してください。これにより、最終結果が得られます。
| CID | RW1 | RW2 | RW3 | RW4 | RW5 | RW6 |
|-----|------|-----|-----|-----|-----|-----|
| 1 | 10 | 33 | 230 | 6 | 13 | 100 |
| 2 | 1222 | 30 | 0 | 0 | 0 | 0 |
| 3 | 2 | 50 | 0 | 0 | 0 | 0 |
| 4 | 33 | 21 | 0 | 0 | 0 | 0 |