我需要在SQL Server中创建一个特定的报告。假设有两个名为A和B的表。我从A和B创建一个临时表,名为TMP。 TMP可以有0到10条记录(这取决于线索值在哪里输入,由用户输入)。我需要将这些记录转换为最终报告中的列。但是由于TMP记录的动态数量以及随之而来的动态列数,我无法使用简单的PIVOT。
我查看了一些类似的问题,但是答案对我的情况没有帮助。
我可以创建一个具有固定列数(10)的空临时表,并用TMP的PIVOT填充它吗?如果没有,您的解决方案是什么?
答案 0 :(得分:0)
您的问题还不清楚,但是我神奇的水晶球告诉我,您可能正在寻找这样的东西:
SELECT p.*
FROM
(
SELECT o.[name]
,CONCAT('Column',ROW_NUMBER() OVER(ORDER BY o.object_id)) AS ColumnName
FROM sys.objects o
--WHERE ...
) t
PIVOT
(
MAX([name]) FOR ColumnName IN(Column1,Column2,Column3 /*add as many as you need*/)
) p;
简而言之:
SELECT
将返回值列表。在此示例中,我使用了sys.objects
并返回了对象的name
。该列表的行数取决于WHERE
子句,但不能超过10(在您的情况下)。
在上面的示例中,我使用CONCAT()
通过添加ROW_NUMBER()
来计算列名。
此计算出的ColumnName可在PIVOT
中使用。
如果列表少于10行,则只会得到NULL。
但是,如果列表的长度可能超过10,则必须小心。在这种情况下,> 10的行将不可见,而不会发出任何通知...