小编典典

在 SQL Server 中使用“透视”将行转换为列

all

我已经阅读了 MS 数据透视表上的内容,但我仍然无法正确解决这个问题。

我有一个正在创建的临时表,我们会说第 1 列是商店编号,第 2 列是周数,最后第 3 列是某种类型的总数。周数也是动态的,商店数是静态的。

Store      Week     xCount
-------    ----     ------
102        1        96
101        1        138
105        1        37
109        1        59
101        2        282
102        2        212
105        2        78
109        2        97
105        3        60
102        3        123
101        3        220
109        3        87

我希望它以数据透视表的形式出现,如下所示:

Store        1          2          3        4        5        6....
----- 
101        138        282        220
102         96        212        123
105         37        
109

将数字存储在侧面,将数周存储在顶部。


阅读 67

收藏
2022-04-18

共1个答案

小编典典

如果您使用的是 SQL Server 2005+,那么您可以使用该PIVOT函数将数据从行转换为列。

如果周数未知,听起来您将需要使用动态 sql,但最初使用硬编码版本更容易看到正确的代码。

首先,这里有一些快速的表定义和数据供使用:

CREATE TABLE yt 
(
  [Store] int, 
  [Week] int, 
  [xCount] int
);

INSERT INTO yt
(
  [Store], 
  [Week], [xCount]
)
VALUES
    (102, 1, 96),
    (101, 1, 138),
    (105, 1, 37),
    (109, 1, 59),
    (101, 2, 282),
    (102, 2, 212),
    (105, 2, 78),
    (109, 2, 97),
    (105, 3, 60),
    (102, 3, 123),
    (101, 3, 220),
    (109, 3, 87);

如果您的值是已知的,那么您将对查询进行硬编码:

select *
from 
(
  select store, week, xCount
  from yt 
) src
pivot
(
  sum(xcount)
  for week in ([1], [2], [3])
) piv;

查看SQL 演示

然后,如果您需要动态生成周数,您的代码将是:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Week) 
                    from yt
                    group by Week
                    order by Week
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT store,' + @cols + ' from 
             (
                select store, week, xCount
                from yt
            ) x
            pivot 
            (
                sum(xCount)
                for week in (' + @cols + ')
            ) p '

execute(@query);

请参阅SQL 演示

动态版本生成week应转换为列的数字列表。两者都给出相同的结果:

| STORE |   1 |   2 |   3 |
---------------------------
|   101 | 138 | 282 | 220 |
|   102 |  96 | 212 | 123 |
|   105 |  37 |  78 |  60 |
|   109 |  59 |  97 |  87 |
2022-04-18