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

Konwersja wyników kolumny do jednego wiersza

Próbujesz PIVOT dane. Serwer SQL ma PIVOT funkcja, która może to dla Ciebie wykonać. Aby wykonać PIVOT musisz zdecydować, jakiej funkcji agregującej użyć. W moim przykładzie użyłem MAX() ale możesz użyć SUM() itp.

Jeśli nie masz funkcji przestawnej, możesz użyć funkcji agregującej z CASE oświadczenie, aby to zrobić.

Wersja zbiorcza/CASE: Ta wersja wymaga zakodowania wszystkich nazw w kolumnach.

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

Zobacz SQL Fiddle z wersją demonstracyjną

Statyczna wersja PIVOT: Zakodujesz na stałe wartości nazw w tym zapytaniu

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

Zobacz SQL Fiddle z wersją demonstracyjną

Powyższe wersje działają świetnie, jeśli masz znaną liczbę kolumn, ale jeśli Twoja nazwa wartości są nieznane, możesz użyć dynamicznego sql do PIVOT dane.

Dynamiczna wersja 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)

Zobacz SQL Fiddle z wersją demonstracyjną

Wszystkie trzy wersje dadzą ten sam wynik:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dziennik SQL Server 2008 nie zostanie obcięty

  2. Jak utworzyć procedurę składowaną, która opcjonalnie będzie przeszukiwać kolumny?

  3. Uprawnienia do tworzenia kopii zapasowych

  4. Wyrażenie regularne do walidacji nazwy tabeli SQL Server

  5. Jak podsumować pole czasu w SQL Server