sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera effektivt rader till kolumner i sql-servern

Det finns flera sätt att omvandla data från flera rader till kolumner.

Med PIVOT

I SQL Server kan du använda PIVOT funktion för att omvandla data från rader till kolumner:

select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
  select value, columnname
  from yourtable
) d
pivot
(
  max(value)
  for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;

Se Demo.

Pivot med okänt antal columnnames

Om du har ett okänt antal columnnames som du vill transponera, då kan du använda dynamisk SQL:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName) 
                    from yourtable
                    group by ColumnName, id
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

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

exec sp_executesql @query;

Se Demo.

Använda en aggregerad funktion

Om du inte vill använda PIVOT funktion, då kan du använda en aggregerad funktion med en CASE uttryck:

select
  max(case when columnname = 'FirstName' then value end) Firstname,
  max(case when columnname = 'Amount' then value end) Amount,
  max(case when columnname = 'PostalCode' then value end) PostalCode,
  max(case when columnname = 'LastName' then value end) LastName,
  max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable

Se Demo.

Använda flera kopplingar

Detta kan också slutföras med hjälp av flera kopplingar, men du behöver någon kolumn för att associera var och en av de rader som du inte har i dina exempeldata. Men den grundläggande syntaxen skulle vara:

select fn.value as FirstName,
  a.value as Amount,
  pc.value as PostalCode,
  ln.value as LastName,
  an.value as AccountNumber
from yourtable fn
left join yourtable a
  on fn.somecol = a.somecol
  and a.columnname = 'Amount'
left join yourtable pc
  on fn.somecol = pc.somecol
  and pc.columnname = 'PostalCode'
left join yourtable ln
  on fn.somecol = ln.somecol
  and ln.columnname = 'LastName'
left join yourtable an
  on fn.somecol = an.somecol
  and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'


  1. COUNT(*) från flera tabeller i MySQL

  2. SQL-frågor

  3. Hur man ändrar kolumndatatyp från tecken till numerisk i PostgreSQL 8.4

  4. Att ta bort de nya Microsoft SQL Server ODBC- och OLEDB-drivrutinerna