Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Ефективно преобразувайте редове в колони в sql сървър

Има няколко начина, по които можете да трансформирате данни от множество редове в колони.

Използване на PIVOT

В SQL Server можете да използвате PIVOT функция за трансформиране на данните от редове в колони:

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;

Вижте Демо.

Опорна точка с неизвестен брой columnnames

Ако имате неизвестен брой columnnames който искате да транспонирате, тогава можете да използвате динамичен 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;

Вижте Демо.

Използване на агрегатна функция

Ако не искате да използвате PIVOT функция, тогава можете да използвате агрегатна функция с CASE израз:

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

Вижте Демо.

Използване на множество съединения

Това също може да бъде завършено с помощта на множество обединявания, но ще ви трябва някаква колона, за да свържете всеки от редовете, които нямате в примерните си данни. Но основният синтаксис би бил:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разделени със запетая резултати в SQL

  2. Как променяте типа данни на колона в SQL Server?

  3. 13 най-добри практики за сигурност на SQL Server

  4. как да конфигурирате конфигурационния файл за хибернация за sql сървър

  5. Моето поле VARCHAR(MAX) се ограничава до 4000; Какво дава?