Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL:Dynamische Ansicht mit Spaltennamen basierend auf Spaltenwerten in der Quelltabelle

Sie können dies mit einem PIVOT . Wenn Sie den PIVOT ausführen, können Sie dies auf zwei Arten tun, mit einem statischen Pivot, mit dem Sie die zu transformierenden Zeilen codieren, oder mit einem dynamischen Pivot, der die Liste der Spalten zur Laufzeit erstellt:

Statisches Pivot (Siehe 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

Oder Sie können einen dynamischen Pivot verwenden (siehe 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)

Beide Abfragen geben die gleichen Ergebnisse zurück.