Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL:widok dynamiczny z nazwami kolumn opartymi na wartościach kolumn w tabeli źródłowej

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

Static Pivot (Zobacz SQL Fiddle w wersji demonstracyjnej ):

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

Możesz też użyć Dynamic Pivot (zobacz SQL Fiddle w wersji demonstracyjnej ):

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)

Oba zapytania zwrócą te same wyniki.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wykonać LEFT ANTI SEMI JOIN w SQL Server

  2. Usuń dane za pomocą funkcji wartościującej tabelę w SQL Server

  3. Kiedy używać EXCEPT w przeciwieństwie do NOT EXISTS w Transact SQL?

  4. Różnica czasu SQL między dwiema datami daje wynik gg:mm:ss

  5. Dlaczego 1899-12-30 jest datą zerową w programie Access/SQL Server zamiast 12/31?