SQL PIVOT 从列表中选择(在选择中)

Posted

技术标签:

【中文标题】SQL PIVOT 从列表中选择(在选择中)【英文标题】:SQL PIVOT SELECT FROM LIST (IN SELECT) 【发布时间】:2011-08-28 23:11:30 【问题描述】:

是否可以执行 PIVOT 并从表中选择列表,而不是使用单个值?

像这样(不正确的语法错误):

SELECT *
FROM (
    SELECT RepID, MilestoneID, ResultID FROM RM
) AS src
PIVOT (
    MAX(ResultID) FOR MilestoneID IN  (SELECT id FROM m) 
) AS pvt

这个可以编译,但对我不起作用:

SELECT *
FROM (
    SELECT RepID, MilestoneID, ResultID FROM RM
) AS src
PIVOT (
    MAX(ResultID) FOR MilestoneID IN  ([1], [2], [3], [4]) 
) AS pvt

PS:我不想使用动态 SQL,有没有办法在不使用动态 SQL 的情况下做到这一点?

【问题讨论】:

不,很遗憾,您需要在 IN 子句中指定值。您可以使用动态 SQL 来检查值,然后执行结果语句。 【参考方案1】:

如果动态SQL出来了,恐怕答案是否定的,做不到。解析器需要预先知道值才能执行对列的透视。

【讨论】:

为什么解析器不知道前面的值?它可以先完成SELECT查询。【参考方案2】:

可以的。

DECLARE @idList varchar(500)
SET @idList = COALESCE(@idList + ',', '') + id
FROM m


DECLARE @sqlToRun varchar(1000)
SET @sqlToRun = '
SELECT * 
FROM ( 
    SELECT RepID, MilestoneID, ResultID FROM RM 
) AS src 
PIVOT ( 
    MAX(ResultID) FOR MilestoneID IN  ('+ @idList +')  
) AS pvt'   

EXEC (@sqlToRun)

【讨论】:

这就是重点。 CoderGal 不想使用动态 SQL。 这可能对发帖者没有帮助,但它有助于提醒我这是可能的!所以+1 rm 是从哪里来的?一些示例数据会对这个示例有所帮助。 很好的解决方案。谢谢。我认为第二行应该是SELECT,而不是SET

以上是关于SQL PIVOT 从列表中选择(在选择中)的主要内容,如果未能解决你的问题,请参考以下文章

sql 从任何列表中选择拆分字符串

如何从 SQL Server 中的值列表中进行选择

使用嵌套查询从表列表/多个表中选择 - MS SQL

如何从下拉列表中选择多个项目并将多个值插入 MYSQL

基础排序算法六——快速排序

选择列表框项目时,在另一个列表框中显示相关数据