Sql server 需要使用sort将行转换为列
我试图将行转换为列,但包含一种数据 样本数据 例如:Sql server 需要使用sort将行转换为列,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我试图将行转换为列,但包含一种数据 样本数据 例如: +-----+------+------+ | CId | Cat1 | cat2 | +-----+------+------+ | 1 | 10 | 6 | | 1 | 230 | 100 | | 2 | 1222 | 30 | | 3 | 2 | 50 | | 4 | 33 | 21 | | 1 | 33 | 13 | +-----+------+------+ 预期
+-----+------+------+
| CId | Cat1 | cat2 |
+-----+------+------+
| 1 | 10 | 6 |
| 1 | 230 | 100 |
| 2 | 1222 | 30 |
| 3 | 2 | 50 |
| 4 | 33 | 21 |
| 1 | 33 | 13 |
+-----+------+------+
预期产量
+-----+------+-----+-----+-----+-----+-----+
| 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 |
+-----+------+-----+-----+-----+-----+-----+
查看CID:1
如何对Cat1
的所有值进行排序完成后,需要对cat2
进行排序,并且所有内容都应在一行中
请告诉我如何操作。您可以通过取消激励和旋转数据来获得结果,但您还需要使用
行编号()
来保持数据按您想要的顺序
第一步是查询当前数据并应用行编号()
为每一行获取一个值,按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)
看。当您取消填充数据时,您将再次应用行号()
,这将用于创建新的列名。这次应用时,您将按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;
看。这给出了一个最终结果:
| 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 |
您可以通过取消激励和旋转数据来获得结果,但您还需要使用
行数()
来保持数据的顺序
第一步是查询当前数据并应用行编号()
为每一行获取一个值,按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)
看。当您取消填充数据时,您将再次应用行号()
,这将用于创建新的列名。这次应用时,您将按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;
看。这给出了一个最终结果:
| 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 |
您可以通过取消激励和旋转数据来获得结果,但您还需要使用
行数()
来保持数据的顺序
第一步是查询当前数据并应用行编号()
为每一行获取一个值,按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)
看。当您取消填充数据时,您将再次应用行号()
,这将用于创建新的列名。这次应用时,您将按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;
看。这给出了一个最终结果:
| 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 |
您可以通过取消激励和旋转数据来获得结果,但您还需要使用
行数()
来保持数据的顺序
第一步是查询当前数据并应用行编号()
为每一行获取一个值,按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)
看。当您取消填充数据时,您将再次应用行号()
,这将用于创建新的列名。这次应用时,您将按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;
看。这给出了一个最终结果:
| 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 |
你是否总是只有6个最终栏目?或者列的数量未知?我将有大约10列,并准备好手动输入列名(如果需要),您是否总是总共只有6列?或者列的数量未知?我将有大约10列,并准备好手动输入列名(如果需要),您是否总是总共只有6列?或者列的数量未知?我将有大约10列,并准备好手动输入列名(如果需要),您是否总是总共只有6列?或者列数未知?我将有大约10列,如果需要,可以手动输入列名