2013-02-15 4 views
0
Job Batch id Company Outlet Id Clearance required Hanky required 
1    10     T     T 

Теперь я хочу, чтобы следующиеPivot ПОМОЩИ QUERY

Job Batch id Company Outlet ID Reason  
1    10     Clearance Required , Hanky Required 

Мой мозг замерз так было, нуждающихся в помощи?

Как построить этот запрос без ключа?

ответ

1

Здесь вы идете - просто объединить ваши такие столбцы. Я использую STUFF удалить начинающую запятую:

select JobBatchId, 
    CompanyOutletId, 
    STUFF(
    ISNULL(CASE WHEN ClearanceRequired = 'T' THEN ',Clearance Required' END, '') + 
    ISNULL(CASE WHEN HankyRequired = 'T' THEN ',Hanky Required' END, '') 
    , 1, 1, '') Reasons 
from YourTable 

И в SQL Fiddle.

1

Я бы советовал положить несколько значений в одном столбце (Reason) в вашем Sql запроса, и вместо того, чтобы оставить это до вашего уровня представления, если это, как вы хотите, чтобы увидеть данные ...

Но вот как вы можете сделать это в Sql:

SELECT 
    [Job Batch Id], 
    [Company Outlet Id], 
    CASE 
     WHEN [Clearance Required] = 'T' 
     THEN 'Clearance Required' 
     ELSE '' END + 
    -- Determine if the comma is needed or not... 
    CASE 
     WHEN [Clearance Required] = 'T' 
      AND [Hanky Required] = 'T' 
     THEN ' , ' 
     ELSE '' END + 
    CASE 
     WHEN [Hanky Required] = 'T' 
     THEN 'Hanky Required' 
     ELSE '' END AS Reason 
FROM YourTable 
1

Try:

select [Job Batch id], [Company Outlet Id], 
     case [Clearance required] 
      when 'T' then 'Clearance Required' + 
       case [Hanky required] when 'T' then ' , ' else '' end 
     else '' 
     end + case [Hanky required] when 'T' then 'Hanky Required' else '' end as [Reason] 
from theTable 
1

вы можете использовать UNPIVOT, CROSS APPLY и FOR XML PATH получить результат:

;with cte as 
(
    select [Job Batch id], [Company Outlet Id], 
    col, value 
    from yourtable 
    unpivot 
    (
    value 
    for col in ([Clearance required], [Hanky required]) 
) unpiv 
) 
select distinct t1.[Job Batch id], 
    t1.[Company Outlet Id], 
    left(s.reason, len(s.reason)-1) reason 
from cte t1 
cross apply 
(
    select t2.col + ', ' 
    FROM cte t2 
    where t1.[Job Batch id] = t2.[Job Batch id] 
    and t1.[Company Outlet Id] = t2.[Company Outlet Id] 
    FOR XML PATH('') 
) s (reason) 

См SQL Fiddle with Demo

Или вы можете использовать UNPIVOT, STUFF и FOR XML PATH:

;with cte as 
(
    select [Job Batch id], [Company Outlet Id], 
    col, value 
    from yourtable 
    unpivot 
    (
    value 
    for col in ([Clearance required], [Hanky required]) 
) unpiv 
) 
select distinct t1.[Job Batch id], 
    t1.[Company Outlet Id], 
    STUFF(
     (SELECT ', ' + col 
      FROM cte t2 
      where t1.[Job Batch id] = t2.[Job Batch id] 
      and t1.[Company Outlet Id] = t2.[Company Outlet Id] 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Reason 
from cte t1 

См SQL Fiddle with Demo