【发布时间】:2019-04-19 10:38:14
【问题描述】:
我正在尝试创建一个数据透视表。来源如下:
+--------+------------+-----------+--------+--------+------------+
| UserId | LastName | FirstName | Param1 | Param2 | Date |
+--------+------------+-----------+--------+--------+------------+
| 1 | Snow | John | Text1 | Text1 | 01-01-2019 |
| 2 | Lannister | Tyrion | Text1 | Text1 | 01-01-2019 |
| 3 | Targaryen | Daenerys | Text2 | Text2 | 01-01-2019 |
| 1 | Snow | John | Text3 | Text2 | 01-02-2019 |
| 2 | Lannister | Tyrion | Text3 | Text2 | 01-02-2019 |
| 3 | Targaryen | Daenerys | Text3 | Text3 | 01-02-2019 |
| | | | | | … 120 days |
+--------+------------+-----------+--------+--------+------------+
这就是我想要实现的目标:
+--------+------------+-----------+-------------------+-------------------+-------------------+-------------------+---+
| UserId | LastName | FirstName | Param1:01-01-2019 | Param2:01-01-2019 | Param1:01-02-2019 | Param2:01-02-2019 | … |
+--------+------------+-----------+-------------------+-------------------+-------------------+-------------------+---+
| 1 | Snow | John | Text1 | Text1 | Text3 | Text2 | … |
| 2 | Lannister | Tyrion | Text1 | Text1 | Text3 | Text2 | … |
| 3 | Targaryen | Daenerys | Text2 | Text2 | Text3 | Text3 | … |
+--------+------------+-----------+-------------------+-------------------+-------------------+-------------------+---+
所以,基本上,我正在尝试解决 2 个问题:
- 为日期动态创建 120 列。
- 对 Date、Param1 和 Param2 使用 3 个聚合函数
注意:Param1 和 Param2 列具有预定义值(每个大约 10 个)
我的起始静态数据透视查询是这样的:
WITH PivotData AS
(
SELECT
[UserId]
,[Last Name]
,[First Name]
,[Param1]
,[Param2]
,[Date]
FROM [dbo].[MyTable]
)
SELECT [Last Name], [First Name], [Param1:01-01-2019], [Param2:01-01-2019], [Param1:01-02-2019], [Param2:01-02-2019]
FROM PivotData
PIVOT ( MAX([Param1]) FOR [Date] in ([Param1:01-01-2019], [Param1:01-01-2019]) ) AS P1
PIVOT ( MAX([Param2) FOR [Date] in ([Param2:01-02-2019], [Param2:01-02-2019]) ) AS P2
更新 1:
我使用了另一个查询,但仍然需要动态执行,所以原始问题仍然存在
SELECT
[UserId]
MAX(CASE WHEN [Date] = '2019-01-01' THEN ISNULL([Param1], NULL) ELSE NULL END) AS [Param1:2019-01-01],
MAX(CASE WHEN [Date] = '2019-01-01' THEN ISNULL([Param2], NULL) ELSE NULL END) AS [Param2:2019-01-01],
MAX(CASE WHEN [Date] = '2019-01-01' THEN ISNULL([Param3], NULL) ELSE NULL END) AS [Param3:2019-01-01],
MAX(CASE WHEN [Date] = '2019-01-02' THEN ISNULL([Param1], NULL) ELSE NULL END) AS [Param1:2019-01-02],
MAX(CASE WHEN [Date] = '2019-01-02' THEN ISNULL([Param2], NULL) ELSE NULL END) AS [Param2:2019-01-02],
MAX(CASE WHEN [Date] = '2019-01-02' THEN ISNULL([Param3], NULL) ELSE NULL END) AS [Param3:2019-01-02],
FROM [dbo].[MyTable]
GROUP BY [UserId]
ORDER BY [UserId]
但是逻辑对我来说仍然令人困惑。 请帮忙。
【问题讨论】:
-
使用
Dynamic SQLdocs.microsoft.com/en-us/sql/relational-databases/… -
这很简单,但是您首先提到了 2 列,然后提到了 3。哪个是正确的?这可能没有什么不同,但我只是想让它清楚。
-
另外,是 120 列还是 120 日期(乘以列数)?您有开始日期和结束日期,还是来自表格值?
标签: sql sql-server pivot pivot-table