2013-07-08 5 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 아, 나는있어 -

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 등을 작업 단계 이름으로 대체 할 방법을 모르십니까?

건배

앵커 쿼리에서 테이블 JobPhases 다음 '을 FOR Name IN에 목록과 단계 목록'상 이름을 사용하는 이름을 가진

답변

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 해당 테이블 :

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을 사용하여이 작업을 동적으로 수행해야합니다 (예 : [** this post **] (http://stackoverflow.com/a/16589658/722783)). –