2013-07-08 3 views
0

Im пытается произвести следующий вывод из 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, I have -

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? Cheers – dynamicuser

+1

Да, в этом случае вы должны делать это динамически, используя динамический SQL, например, см. [** этот пост **] (http://stackoverflow.com/a/16589658/722783). –

Смежные вопросы