20

Is it possible to do a PIVOT and select list from a table, instead of using single values?

Like this (incorrect syntax error):

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

This one compiles, but doesn't work for me:

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

PS: I do NOT want to use dynamic SQL, is there a way to do this without using dynamic SQL?

live-love
  • 48,840
  • 22
  • 240
  • 204
  • Nope, unfortunately you need to specific the values in the `IN` clause. You could use dynamic SQL to inspect the values and then execute the resulting statement. – Yuck May 19 '11 at 14:55

2 Answers2

15

If dynamic SQL is out then I'm afraid the answer is no, it can't be done. The parser needs to know the values up front to perform the pivot to columns.

Yuck
  • 49,664
  • 13
  • 105
  • 135
  • 8
    Why doesn't the parser know the values up front? It could complete the `SELECT` query first. – Jez Dec 09 '16 at 19:05
10

It Can be done.

DECLARE @idList varchar(500)
SELECT @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)
Joundill
  • 6,828
  • 12
  • 36
  • 50
Krunal Savani
  • 129
  • 1
  • 2