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

Převod výsledků sloupce do jednoho řádku

Pokoušíte se PIVOT data. SQL server má PIVOT funkce, která to může provést za vás. Pro provedení PIVOT musíte se rozhodnout, jakou agregační funkci použít. V mém příkladu jsem použil MAX() ale můžete použít SUM() , atd.

Pokud nemáte kontingenční funkci, můžete použít agregační funkci s CASE prohlášení k tomu.

Agregovaná/CASE verze: Tato verze vyžaduje, abyste pevně zakódovali všechny názvy do sloupců.

select 
  max(case when name = 'Engineering' then rating end) Engineering,
  max(case when name = 'Financials' then rating end) Financials,
  max(case when name = 'Scope' then rating end) Scope,
  max(case when name = 'Schedule' then rating end) Schedule,
  max(case when name = 'Risks' then rating end) Risks,
  max(case when name = 'People' then rating end) People
from yourtable

Viz SQL Fiddle s ukázkou

Statická verze PIVOT: Do tohoto dotazu natvrdo zakódujete hodnoty jmen

select *
from
(
  select name, rating
  from yourtable
) src
pivot
(
  max(rating)
  for name in ([Engineering], [Financials], [Scope],
               [Schedule], [Risks], [People])
) piv

Viz SQL Fiddle s ukázkou

Výše uvedené verze fungují skvěle, pokud máte známý počet sloupců, ale pokud máte name hodnoty neznámé, pak můžete použít dynamické sql k PIVOT data.

Verze dynamického PIVOT:

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

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

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

execute(@query)

Viz SQL Fiddle s ukázkou

Všechny tři verze poskytnou stejný výsledek:

| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
|           1 |          3 |     1 |        2 |     3 |      3 |



  1. Vytváření a používání uložených procedur MySQL – výukový program

  2. Jak převést interval jako 1 den 01:30:00 na 25:30:00?

  3. Zpracování výjimek v Proceduře s vnořenými funkcemi v pl/sql

  4. Jak bych měl řešit --secure-file-priv v MySQL?