2013-02-20 50 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 

我想我集團對公司ID結果和計算每個狀態,並列出它們作爲單獨的列。

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