【问题标题】:SQL Pivot: Can I make the pivot list dynamic without using stored proc?SQL Pivot:我可以在不使用存储过程的情况下使数据透视列表动态化吗?
【发布时间】:2020-07-15 14:14:07
【问题描述】:

这是我的包含数据透视的 SQL:

select * from (
    select 
        [event_id]
        ,[attnum]
        ,PollId
        ,PollResponseDisplayText
    from 
        [dbo].[v_PollReportDetails2]
) as tmp
pivot (max(tmp.[PollResponseDisplayText])
for tmp.PollId in ([703],[805],[806],[807],[808],[809])) as pivot_table

我想把数据透视表改成这样:

for tmp.PollId in (select PollId 
                    from Polls 
                    where event_id = 100100
                    and isVisible = 1)) as pivot_table

我可以在一个存储过程中完成这一切,并动态生成一条 SQL 语句以输入 execute() 语句,但我需要能够在视图中执行此操作。

【问题讨论】:

  • 能否请您添加一些表格的示例数据
  • 你不能 - 视图只能有静态定义(至少在 SQL 服务器中 - 你没有标记你的 DBMS)。
  • PIVOT 子句要求在查询设计时(查询执行之前)知道这些不同的值。

标签: sql sql-server tsql pivot


【解决方案1】:

也许我在寻找错误的地方,但我似乎无法找到实际上说这无法完成的官方文档。但经过数小时的试验和讨论,显然不能这样。

@aeoluseros 在他的评论中说得最好,

PIVOT 子句的语法要求这些不同的值在 查询设计时间。所以你不能在视图中使用它

从逻辑上讲,这是有道理的,因为随着时间的推移我们向表中添加行,它可能会动态地将列添加到视图结果中。

感谢@Damien_The_Unbeliever 的进一步澄清,请参阅此处:
https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15#syntax

【讨论】:

  • 您不会找到关于任何给定功能不可能的所有内容的文档。但是,如果您查看syntax diagram(并了解一些有关 SQL Server 的语法图),您会意识到它特别需要一组固定的列。 IN ( [first pivoted column], [second pivoted column], ... [last pivoted column])没有其他选择
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2015-11-12
  • 2018-12-27
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多