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


是否可以从表中执行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的情况下执行此操作?


2534
2018-05-19 14:49


起源

不幸的是,你需要具体说明中的值 IN 条款。您可以使用动态SQL检查值,然后执行生成的语句。 - Yuck


答案:


如果动态SQL出局,那么我担心答案是否定的,它无法完成。解析器需要预先知道值以执行到列的透视。


10
2018-05-19 15:04



为什么解析器不能预先知道值?它可以完成 SELECT 先查询。 - Jez


可以办到。

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)

2
2018-06-11 16:22



这就是重点。 CoderGal不想使用动态SQL。 - rvphx
它可能对海报没有帮助,但它有助于提醒我它可能!所以+1 - Jay1b