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

Dynamiczne wartości kolumn przestawnych MSSQL do nagłówka kolumny

Problem z aktualnym zapytaniem dotyczy linii:

MAX(SERVER_ID)

Chcesz wyświetlić PROPERTY_CHAR_VAL dla każdej PROPERTY_NAME zamiast. SERVER_ID będzie częścią końcowego wyniku jako kolumna.

Czasami, gdy pracujesz z PIVOT, łatwiej jest najpierw napisać kod z wartościami zakodowanymi na stałe, podobnymi do:

select id, name1, name2, name3, name4
from
(
  select id, property_name, property_value
  from yourtable
) d
pivot
(
  max(property_value)
  for property_name in (name1, name2, name3, name4)
) piv;

Zobacz SQL Fiddle z wersją demonstracyjną .

Gdy masz wersję, która ma poprawną logikę, możesz przekonwertować ją na dynamiczny SQL, aby uzyskać wynik. Spowoduje to utworzenie ciągu sql, który zostanie wykonany i będzie zawierał wszystkie nowe nazwy kolumn.

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' 
            from 
            (
              select id, property_name, property_value
              from yourtable
            ) x
            pivot 
            (
                max(property_value)
                for property_name in (' + @cols + ')
            ) p '

execute sp_executesql @query;

Zobacz SQL Fiddle z wersją demonstracyjną . Oba dadzą wynik:

| ID |  NAME1 |  NAME2 |  NAME3 |  NAME4 |  NAME6 |
|----|--------|--------|--------|--------|--------|
|  1 |  value |  value |  value | (null) | (null) |
|  2 | (null) |  value | (null) |  value | (null) |
|  3 | (null) | (null) | (null) | (null) |  value |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oblicz skrót lub sumę kontrolną dla tabeli w SQL Server

  2. Jak wygenerować interwały minutowe między dwiema datami w T-SQL?

  3. Wiele dni tygodnia przechowywanych w jednym polu

  4. Jak testujesz istnienie użytkownika w SQL Server?

  5. Konwertuj datę na inną strefę czasową w SQL Server