2012-06-11 12 views
5

Biorąc pod uwagę te dwie tabele przykładowe tutaj:SQL: Dynamiczny widok z nazwami kolumn opartych na wartościach kolumn w tabeli źródłowej

Bilety Tabela

ID User Description 

0 James This is a support ticket 
1 Fred This is a ticket too 

Właściwości tabeli

ID TicketID Label   Value 

0 0   Engineer  Scott 
1 1   Engineer  Dale 
2 0   Manu   Dell 
3 1   Manu   HP 
4 0   OS    Windows 
5 1   OS    Linux 

Jak mogę wyświetlić następujący widok:

ID User Description     Engineer Manu OS 

1 James This is a support ticket Scott  Dell Windows 
2 Fred This is a ticket too  Dale  HP  Linux 

Należy zauważyć, że tabela właściwości nie zawsze będzie taka sama. Niektóre "bilety" mogą mieć właściwości, których inni nie posiadają.

Czy to możliwe?

+2

Tabele własności są diabłem. –

+0

@Jeremy, dzięki czemu można łatwo kodować nazwy właściwości jako nazwy kolumn. Obaj mają swoje miejsce. –

+0

@AaronBertrand, po raz kolejny nie zgadzam się z tobą ... ale za każdym razem, gdy muszę korzystać z tabel właściwości, prawie zawsze mam problemy z wydajnością, i zwykle są to bóle w tyłku do przestawiania. –

Odpowiedz

11

Można to wykonać za pomocą PIVOT. Wykonując PIVOT, możesz zrobić to na dwa sposoby, za pomocą Static Pivot, który zakoduje wiersze do przekształcenia lub Dynamic Pivot, który utworzy listę kolumn w czasie wykonywania:

Statyczny Pivot (patrz SQL Fiddle for Demo):

select id, [user], [engineer], [manu], [OS] 
from 
(
    select t.id 
     , t.[user] 
     , p.ticketid 
     , p.label 
     , p.value 
    from tickets t 
    inner join properties p 
     on t.id = p.ticketid 
) x 
pivot 
(
    min(value) 
    for label in ([engineer], [manu], [OS]) 
) p 

Albo można użyć dynamiczny pivot (Zobacz SQL Fiddle for Demo):

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.label) 
        from tickets t 
        inner join properties p 
         on t.id = p.ticketid 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, [user], ' + @cols + ' from 
      (
       select t.id 
         , t.[user] 
         , p.ticketid 
         , p.label 
         , p.value 
        from tickets t 
        inner join properties p 
         on t.id = p.ticketid 
      ) x 
      pivot 
      (
       min(value) 
       for label in (' + @cols + ') 
      ) p ' 

execute(@query) 

Zarówno zapytanie zwróci te same rezultaty.

+0

Twój pierwszy przykład jest znacznie bardziej skomplikowany niż mój z dokładnie takimi samymi wynikami, a drugi ... dynamiczny sql? Przed pójściem tą trasą, myślę, że chciałbyś się upewnić, że to wymaganie i jak stół zostanie skonsumowany. –

+0

Jesteś moim nowym bohaterem. Chcę mieć twoje dzieci. (Dynamic Pivot działa DOKŁADNIE jak potrzebuję) –

+1

@JeremyHolovacs Nie zgadzam się, że pierwsza jest bardziej skomplikowana niż twoja wersja z 3 lewymi złączeniami. Jeśli chodzi o wersję dynamiczną, OP zażądał dynamicznej wersji zapytania, które byłoby elastyczne i to właśnie zapewniłem. Zawsze są inne sposoby na odpowiedź na pytanie, zachęcamy do zaproponowania innego dynamicznego sposobu. :) – Taryn

Powiązane problemy