sql >> Database >  >> RDS >> Sqlserver

De resultaten van een kolom omzetten in een enkele rij

U probeert PIVOT de data. SQL-server heeft een PIVOT functie die dit voor u kan uitvoeren. De PIVOT uitvoeren u moet beslissen welke aggregatiefunctie u wilt gebruiken. In mijn voorbeeld gebruikte ik MAX() maar je kunt SUM() . gebruiken , enz.

Als u geen spilfunctie hebt, kunt u een aggregatiefunctie gebruiken met een CASE verklaring om dit te doen.

Geaggregeerde/CASE-versie: Deze versie vereist dat u alle namen hard codeert in de kolommen.

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

Zie SQL Fiddle met demo

Statische PIVOT-versie: U zult de waarden van de namen hard coderen in deze query

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

Zie SQL Fiddle met demo

De bovenstaande versies werken prima als u een bekend aantal kolommen heeft, maar als uw name waarden zijn onbekend, dan kunt u dynamische sql gebruiken om PIVOT de gegevens.

Dynamische PIVOT-versie:

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)

Zie SQL Fiddle met demo

Alle drie de versies zullen hetzelfde resultaat opleveren:

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



  1. Haal de dichtstbijzijnde lengte- en breedtegraad uit de MSSQL-databasetabel?

  2. Waarom mislukt het maken van Foreign Key in Laravel 5.8?

  3. ALS NIET BESTAAT in trigger

  4. Laravel 5.1 - Een databaseverbinding controleren