admin

分别计算一列中的值

sql

我的数据库中有一个具有以下结构的表。

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分组,并对每个状态进行计数,并将它们作为单独的列列出。

IE

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

我的问题是如何从表格中获得上述结果?并可能加入了公司表。

尝试了几种可能性,但没有得到结果。


阅读 146

收藏
2021-06-07

共1个答案

admin

这种类型的数据转换称为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

如果您有已知数量的要转换为列的值,则上面的两个版本会很好地工作。但是,如果未知,则可以使用动态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

全部给出结果:

| COMPANY_ID | STATUS1 | STATUS2 | STATUS3 |
--------------------------------------------
|         10 |       2 |       2 |       0 |
|         12 |       1 |       2 |       0 |
|         13 |       0 |       0 |       1 |
|         14 |       0 |       0 |       2 |
2021-06-07