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列,如果需要,可以手动输入列名