Этот тип преобразования данных известен как PIVOT
. Существует несколько способов поворота данных.
Вы можете использовать агрегатную функцию с CASE
выражением:
select company_id,
sum(case when status = 1 then 1 else 0 end) status1,
sum(case when status = 2 then 1 else 0 end) status2,
sum(case when status = 3 then 1 else 0 end) status3
from yourtable
group by company_id;
SQL Fiddle with Demo См
Начиная с SQL Server 2005+ можно использовать PIVOT
функцию:
select company_id,
[1] as Status1,
[2] as Status2,
[3] as Status3
from
(
select company_id, status
from yourtable
)src
pivot
(
count(status)
for status in ([1], [2], [3])
) piv
См SQL Fiddle with Demo ,
Две версии выше хорошо работают, если у вас есть известное количество значений для преобразования в столбцы. Но если это неизвестно, то вы можете использовать динамический SQL для создания результата:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Status'+cast(status as varchar(10)))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT company_id,' + @cols + ' from
(
select company_id, ''Status''+cast(status as varchar(10)) Status
from yourtable
) x
pivot
(
count(Status)
for Status in (' + @cols + ')
) p '
execute(@query)
См SQL Fiddle with Demo.
Все дают результат:
| COMPANY_ID | STATUS1 | STATUS2 | STATUS3 |
--------------------------------------------
| 10 | 2 | 2 | 0 |
| 12 | 1 | 2 | 0 |
| 13 | 0 | 0 | 1 |
| 14 | 0 | 0 | 2 |