0

我正在尝试将行转换为列,但包含一种数据。

示例数据例如:

+-----+------+------+
| 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并且所有内容都应该在一行中。

请让我知道该怎么做。

4

1 回答 1

3

您可以通过对数据进行反透视和旋转来获得结果,但您还需要使用它row_number()来将数据保持在您想要的顺序中。

第一步是查询您当前的数据并应用 arow_number()来获取每一行的值,由 the 分区并按andcid排序:cat1cat2

select cid, cat1, cat2,
  row_number() over(partition by cid order by cat1, cat2) seq
from yourtable

请参阅演示。获得数据后,您将取消透视多列cat1cat2转换为具有多行的单列。您可以使用 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 |
于 2013-10-23T23:53:17.360 回答