【发布时间】:2019-05-24 13:50:19
【问题描述】:
有没有什么方法可以通过优雅的函数在 SQL Server 中实现动态透视表?数据透视表是一种基本实用程序,理论上可以在一行代码中完成。我们只需要定义参数:要透视的列变量(将其值更改为列名)、要聚合的变量、聚合函数和执行透视的表。
我正在寻找 Microsoft 为 2019 年 SQL Server 中的数据透视表提出的语法的替代方案。
我在这里找到了一个实用的替代方案: https://stackoverflow.com/a/45065584/1903793
所有复杂的代码都用存储过程包装。在这个优雅的单行中,我们定义了旋转所需的所有参数。
exec [dbo].[USP_DYNAMIC_PIVOT] 'date','category','amount','dbo.temp','sum'
但该解决方案的警告是它是一个存储过程,因此它需要一个静态表作为输入,它还输出一个静态表。如果它可能是一种我们可以从中选择的 TVF,那就更好了。
cmets 后更新。 在我开始使用 SQL Server 之前,我什至不知道旋转可能是静态的。需要进行动态旋转。许多其他应用程序在运行中(Excel、Power BI、R)执行数据透视表,而不受列名必须先验已知的约束。在 2005 年可能会遇到一个问题,即实现旋转可以作为带有参数的函数来完成。但是,嘿,我们将走向未来,而我们将在未来几十年为这个基本的表转换实用程序使用复杂的约束语法是荒谬的。
【问题讨论】:
-
另一种选择,因为您认为语法不可靠,这与实际 需要 动态枢轴完全不同。无论如何,在任何情况下都不可能将这样的东西打包为 TVF,因为 T-SQL 厌恶动态结果集。可以肯定的是,如果您需要输出形状取决于输入的输出,那么唯一可以做到的就是存储过程,即使那样也可能不舒服。 (此外,该语法“只有”14 年的历史,已于 2005 年引入,尽管所涉及的开发人员可能被命名为摩西,也可能不被命名。)
-
TVF 会更好,但它们不支持动态 SQL。
-
老实说,我不记得
PIVOT的语法了,但那是因为我只使用交叉表,因为它们的性能更好,而且它们的功能更灵活。 -
不清楚你在寻找什么样的答案。显然,如果您提供赏金,当前的人不会为您做这件事,但实际上,您想从这个问题中得到什么?验证你的意见?微软的承诺?对于“是否有一种简单的方法可以在 T-SQL 中进行动态透视”的简短而准确的回答是“否”。还有其他问题可以解决问题本身,并且您已经链接到其中之一。还有什么?
-
@PrzemyslawRemin,你已经得到了这个问题的答案。动态枢轴的唯一解决方案或“解决方法”是执行使用动态 SQL 的存储过程。没有替代。 CLR 函数将无济于事,因为它还必须先验定义其输出列 - SQL 中的任何“函数”,其结果可能通过管道传递到进一步的查询中,都必须具有静态表结构。
标签: sql sql-server pivot pivot-table