3

データベースに次の構造のテーブルがあります。

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

2 に答える 2

7
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
于 2013-02-20T11:54:30.380 に答える
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 を参照してください

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を参照してください。

上記の 2 つのバージョンは、列に変換する既知の数の値がある場合にうまく機能します。ただし、不明な場合は、動的 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 |
于 2013-02-20T11:56:35.140 に答える