2013-07-08 37 views
0

我試着去生成一個SQL以下輸出2008查詢 -SQL SELECT

JobID | Repair & Reshape | Refit Stripped Parts | Polishing 
1000 | true    | true     | false 
1001 | true    | true     | false 
1002 | true    | true     | false 
1003 | true    | true     | false 
1004 | true    | true     | false 

表結構我是 -

JobDetails

ID - PK Auto increment 
JobID - Int (Joined to Jobs table) 
PhaseID - String (joined to JobPhases table) 

JobPhases

ID - PK String 
Name - VarChar(150) 

因此f AR,我有 -

SELECT JobID, [0], [1], [2], [3], [4], [5], [6], [7] 
FROM  
( 
    SELECT JobID, PhaseID, [x] = 1 FROM JobDetails 
) JobDetails 
PIVOT 
( SUM(x) 
    FOR PhaseID IN ([0], [1], [2], [3], [4], [5], [6], [7]) 
) pvt 

但不知道我要如何用作業階段名稱替換0-7等?

乾杯

回答

2

檢查這一點,你可能會得到怎樣的想法去實現它

Distinct Row values as Columns Sql Server

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

    select @cols = STUFF((SELECT ',' + QUOTENAME(jobtype) 
         from yourtable 
         group by jobtype 
         ORDER BY jobtype 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
      ,1,1,'') 
    --SELECT @cols 
    set @query = 'SELECT JobID,' + @cols + ' from 
       (
        select JobID, jobtype, jobvalue from yourtable 
       ) x 
       pivot 
       (
        MAX(jobvalue) 
        for jobtype in (' + @cols + ') 
       ) p ' 

    execute(@query) 
1

JOIN該表與表JobPhases在錨查詢,然後使用階段的名稱列表中FOR Name IN並列出階段的名字:

SELECT * 
FROM  
( 
    SELECT j.JobID, j.PhaseID, p.Name, x 
    FROM JobDetails AS j 
    INNER JOIN JobPhases AS p ON p.ID = j.haseId 
) JobDetails 
PIVOT 
( SUM(x) 
    FOR Name IN ([phasename1], [phasename2], ...) 
) pvt 
+0

這是有效的,但是有沒有辦法避免手動輸入階段名稱,但在JobPhases表的基於選擇的語句中執行?歡呼 – dynamicuser

+1

是的,在這種情況下,您必須使用動態SQL動態執行此操作,例如,請參閱[**此帖子**](http://stackoverflow.com/a/16589658/722783)。 –