我已经阅读了MS pivot表上的内容,但我仍然无法正确理解.

我有一个正在创建的临时表,我们会说第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

将数字储存在一边,并在顶部储存数周.

推荐答案

如果您使用的是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 Demo

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

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 Demo.

动态版本生成week个数字的列表,这些数字应转换为列.两者都给出了相同的结果:

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

Sql相关问答推荐

如何转换和汇总行数

为什么在这种情况下我不能使用LAG函数?

删除事务中的本地临时表

在Oracle SQL中将列值转换为行

SQL计数条目大于日期,包括交叉表中的零

基于另一个(SAS、SQL)中的值更新列

TSQL如何为群分配号码

输出连续出现两次以上的行

Netezza SQL:判断两个表是否相同

每个分组最多 Select 最后 2 个值并并排显示它们

计算不同模式的时间跨度

删除对 JSON 数据的未解析引用的 SQL71502 警告

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

INSERT INTO 语法

在where语句中使用CTE非常缓慢

删除重复记录但保留最新的SQL查询

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

MS ACCESS 错误插入 X(...) 从 A 联合 Select ... 从 B

在 postgresql 中保存带有时间戳的几何类型数据

SQL Select 最大并获取列名