sql >> Databáze >  >> RDS >> Sqlserver

Dynamické pivotování hodnot sloupce MSSQL do záhlaví sloupce

Problém s vaším aktuálním dotazem je s řádkem:

MAX(SERVER_ID)

Chcete zobrazit PROPERTY_CHAR_VAL pro každou PROPERTY_NAME namísto. SERVER_ID bude součástí konečného výsledku jako sloupec.

Někdy, když pracujete s PIVOTem, je jednodušší nejprve napsat kód s pevně zakódovanými hodnotami podobnými:

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;

Viz SQL Fiddle s ukázkou .

Jakmile budete mít verzi, která má správnou logiku, můžete ji převést na dynamický SQL, abyste získali výsledek. Tím se vytvoří řetězec SQL, který bude spuštěn a bude obsahovat všechny vaše nové názvy sloupců.

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;

Viz SQL Fiddle s ukázkou . Oba dají výsledek:

| 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. Výběr ze stejné tabulky více než jednou ve stejném dotazu

  2. mysql vyberte z n posledních řádků

  3. Mapování sady výsledků JDBC na objekt

  4. PHP MySQL řecká písmena zobrazující se jako ???? značky