【问题标题】:convert dynamic number of rows in sql to fixed number of columns将sql中的动态行数转换为固定列数
【发布时间】:2019-11-11 07:28:43
【问题描述】:

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

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

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

【问题讨论】:

  • 生成最终报告的原因是什么?它是某种形式的报告构建工具或应用程序吗?在 there 而不是在 SQL 中进行数据透视可能更容易。
  • 我必须使用 SQL 服务器

标签: sql-server tsql pivot


【解决方案1】:

你的问题不是很清楚,但我的魔法水晶球告诉我,你可能正在寻找这样的东西:

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 行将不可见,恕不另行通知...

【讨论】:

  • tnx 很多。太有帮助了
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 2020-06-02
  • 2022-01-21
相关资源
最近更新 更多