Существует несколько способов преобразования данных из нескольких строк в столбцы.
С помощью 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'
cross join
а неleft join
потому, что каждый подзапрос возвращает одну строку.Это скорее метод, чем просто один скрипт, но он дает вам гораздо больше гибкости.
Прежде всего, есть 3 объекта:
ColumnActionList
] -> содержит данные в качестве параметраproc_PivotPrepare
] -> готовит наши данныеproc_PivotExecute
] -> выполнить скриптCREATE TYPE [dbo]. [ColumnActionList] AS TABLE ([ID] [smallint] NOT NULL, [ColumnName] nvarchar NOT NULL, [Action] nchar NOT NULL); ИДТИ
После выполнения первого запроса (путем передачи исходной базы данных и имени таблицы) вы получите предварительно созданный запрос выполнения для второго SP, все, что вам нужно сделать, это определить столбец из вашего источника: + Stable + Value (будет использоваться чтобы сконцентрировать значения, основанные на этом) + Dim (столбец, который вы хотите использовать для поворота)
Имена и типы данных будут определены автоматически!
Я не могу рекомендовать его для любых производственных сред, но выполняю работу для специальных запросов BI.
источник
Could not find stored procedure 'dbo.sp_PivotIt'.
советов?sp_Pivot_Execute
изменить наproc_PivotExecute
.