将sql中的动态行数转换为固定的列数

时间:2019-11-11 07:28:43

标签: sql-server tsql pivot

我需要在SQL Server中创建一个特定的报告。假设有两个名为A和B的表。我从A和B创建一个临时表,名为TMP。 TMP可以有0到10条记录(这取决于线索值在哪里输入,由用户输入)。我需要将这些记录转换为最终报告中的列。但是由于TMP记录的动态数量以及随之而来的动态列数,我无法使用简单的PIVOT。

我查看了一些类似的问题,但是答案对我的情况没有帮助。

我可以创建一个具有固定列数(10)的空临时表,并用TMP的PIVOT填充它吗?如果没有,您的解决方案是什么?

1 个答案:

答案 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的行将不可见,而不会发出任何通知...