您可以通过对数据进行反透视和旋转来获得结果,但您还需要使用它row_number()
来将数据保持在您想要的顺序中。
第一步是查询您当前的数据并应用 arow_number()
来获取每一行的值,由 the 分区并按andcid
排序: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 |