sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter effektivt rækker til kolonner i sql-server

Der er flere måder, hvorpå du kan transformere data fra flere rækker til kolonner.

Ved brug af PIVOT

I SQL Server kan du bruge PIVOT funktion til at transformere data fra rækker til kolonner:

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 ukendt antal columnnames

Hvis du har et ukendt antal columnnames som du vil transponere, så kan du bruge 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.

Brug af en aggregeret funktion

Hvis du ikke ønsker at bruge PIVOT funktion, så kan du bruge en aggregeret funktion med en CASE udtryk:

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.

Brug af flere joinforbindelser

Dette kan også udføres ved hjælp af flere joinforbindelser, men du skal bruge en kolonne til at tilknytte hver af de rækker, som du ikke har i dine eksempeldata. Men den grundlæggende syntaks ville være:

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. Hvordan genererer man en version 4 (tilfældig) UUID på Oracle?

  2. SQL Server trunkering og 8192 begrænsning

  3. En sammenligning mellem MySQL Clone Plugin og Xtrabackup

  4. Beregning af afstand mellem postnumre i PHP