SQL Pivot on 条件计数

问题描述 投票:0回答:2

当我执行以下查询时,我有一个使用 SQL Server 的漏洞表

select * from table 

输出看起来像这样。

| Name          | HostName   | Week   |
| ------------- |------------| -------|
| java          | Hosta      |    1   |
| java          | Hostb      |    1   |
| java          | Hostb      |    2   |
| Ansible       | Hosta      |    1   |
| Ansible       | Hosta      |    2   |
| Ansible       | Hosta      |    3   |
| Ansible       | Hostb      |    3   |

我的目标是生成一个输出,将周转入柱形表,其值是该周给定漏洞的主机计数。

| Vulnerability | Week 1 | Week 2 | Week 3 |
| ------------- |--------| -------| -------|
| java          |    2   |    1   |    0   |
| Ansible       |    1   |    1   |    2   |

我最初的尝试是做

select * from table 
PIVOT(
count(HostName)
For week in ([1],[2],[3])
) AS OUT

但是输出是正确的布局,但数据不正确,就好像它只计算第一次出现一样。 是否需要对计数术语进行修改,或者我的方法是否错误?

sql sql-server pivot
2个回答
3
投票

条件聚合更简单:

select vulnerability,
       sum(case when week = 1 then 1 else 0 end) as week_1,
       sum(case when week = 2 then 1 else 0 end) as week_2,
       sum(case when week = 3 then 1 else 0 end) as week_3
from t
group by vulnerability;

仅注意

pivot
定制语法,但它对表中的列敏感。 额外的列被解释为“分组依据”条件,影响查询结果。


0
投票

您拥有的

PIVOT
语法非常适合您给出的表定义(fiddle)。

正如所接受的答案中所提到的,实际上您的表可能有其他列,因此它们成为隐式分组列的一部分。

您应该使用派生表或 CTE 仅按照语法中的建议投影所需的列

SELECT Name AS [Vulnerability],
       [1]  AS [Week 1],
       [2]  AS [Week 2],
       [3]  AS [Week 3]
FROM   (SELECT HostName,--<column being aggregated>
               Week,--<column that contains the values that will become column headers>
               Name --<implicit group by column>
        FROM   [table]) p
       PIVOT( COUNT(HostName)
            FOR Week IN ([1], [2], [3]) ) AS Pvt 
© www.soinside.com 2019 - 2024. All rights reserved.