使用 PIVOT 将单年列和多周列转换为单年/周列

cod*_*gle 4 sql-server t-sql unpivot

我有一张大致像这样的桌子。

(Pk int, Year int, Week1, Week2, .., Week53)

每个“周”列中的值是销售数据。我想要做的是从第一个表格中创建一个新表格 -

(PK int, WeekYear, SalesData)

其中“WeekYear”是年份和周数的串联,SalesData 是前一个表中相应字段的相同 salesdata。(只是想暂时取消选择)

SELECT pk,
   [1],
   [2],
   ...
   [1000]
 FROM (SELECT * FROM SalesTable) st
PIVOT
(
AGGREGATE(pk) -- no idea what to use here
FOR pk IN [1],
   [2],
   ...
   [1000]
 );
Run Code Online (Sandbox Code Playgroud)

我目前的尝试毫无意义,因为我不确定要在我的数据集上应用哪个聚合函数。我在辨别创建新专栏 YearWeek 的最佳方式时也遇到了一些麻烦。

这似乎是PIVOT 的一个明显用途(我需要转置表格)。但是,我在思考如何正确完成它时遇到了很多麻烦。这样做的最佳方法是什么?

Ken*_*her 6

对我来说,这听起来更像是 UNPIVOT。

SELECT SalesTable.Pk, CrossApplied.WeekYear, CrossApplied.Value
FROM SalesTable
CROSS APPLY (VALUES ('01'+CAST([Year] AS CHAR(40)), Week1),
                    ('02'+CAST([Year] AS CHAR(40)), Week2),
                    ('03'+CAST([Year] AS CHAR(40)), Week3),
                    .......)
        CrossApplied (WeekYear, Value)
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以进行 UNPIVOT,但使用 CROSS APPLY 是我的最爱。我在这里举一个更一般的例子。