2013-02-20 5 views
2

У меня есть таблица в моей базе данных со следующей структурой.Подсчет значений в столбце отдельно

ID COMPANY_ID Status 
----------------------- 
1  10   1 
2  10   2 
3  12   2 
4  12   2 
5  12   1 
6  13   3 
7  14   3 
8  14   3 
9  10   1 
10  10   2 

Я хочу сгруппировать свои результаты по идентификатору компании и подсчитать каждое состояние и перечислить их как отдельные столбцы.

т.е.

COMPANY_ID Status 1 Status 2 Status 3 
------------------------------------------- 
10    2   2   0 
12    1   2   0 
13    0   0   1 
14    0   0   2 

Мой вопрос, как я могу получить результаты выше моего стола? и, вероятно, присоединиться к таблице компании.

Пробовал несколько вариантов, но не получил результатов.

ответ

4

Этот тип преобразования данных известен как 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 | 
6
select company_id 
,  count(case when status = 1 then 1 end) as [Status 1] 
,  count(case when status = 2 then 1 end) as [Status 2] 
,  count(case when status = 3 then 1 end) as [Status 3] 
from YourTable 
group by 
     company_id 
Смежные вопросы