【发布时间】:2018-09-03 05:18:10
【问题描述】:
我有一张表,其中包含未知数量的任务,如下所示:
+----------+--------+--------+--------+--------+--------+
| CourseID | Task 1 | Task 2 | Task 3 | Task 4 | Task 5 |
+----------+--------+--------+--------+--------+--------+
| EN01 | 15 | 20 | 15 | 25 | 30 |
+----------+--------+--------+--------+--------+--------+
有时有 5 个任务,有时还有更多。如何使用 pivot 编写动态转置查询以获得此结果,而无需特别指定列标题,而不是列标题就像'Task%'
+----------+-------------+------------+
| CourseID | Task Number | Task Total |
+----------+-------------+------------+
| EN01 | Task 1 | 15 |
| EN01 | Task 2 | 20 |
| EN01 | Task 3 | 15 |
| EN01 | Task 4 | 25 |
| EN01 | Task 5 | 30 |
+----------+-------------+------------+
编辑:基本上我需要这个相反的:Efficiently convert rows to columns in sql server
我可以手动完成:
-- Unpivot the table.
SELECT [Class], TaskNumber, TaskTotal
FROM
(SELECT [Class], [Task 1], [Task 2], [Task 3], [Task 4]
FROM [Modules].[dbo].[2018-12ah] where [Given] like '%J:%') p
UNPIVOT
(TaskTotal FOR TaskNumber IN
([Task 1], [Task 2], [Task 3], [Task 4])
)AS Unpivot;
GO
我不知道该怎么做的下一步是动态构建任务 1 到 Z,因此我不必在查询中指定它们。
谢谢
【问题讨论】:
-
这是非常糟糕的数据库设计。如果可能的话,请将您的设计转换为以后的设计。
-
@AnkitBajpai - 我明白,我听到你的声音。我们计划淘汰这个已有 10 年历史的旧系统并正确执行,但是我现在仍然需要支持它,这很不幸。
-
尝试上面显示的任何一个链接,都应该达到你所需要的
-
Sql Server 要求实际表具有固定 列数。编写 unpivot 查询运行,就好像 all 它们总是被填充,然后添加
where条件以过滤掉nulls。
标签: sql sql-server tsql unpivot