当我执行以下查询时,我有一个使用 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
但是输出是正确的布局,但数据不正确,就好像它只计算第一次出现一样。 是否需要对计数术语进行修改,或者我的方法是否错误?
条件聚合更简单:
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
定制语法,但它对表中的列敏感。 额外的列被解释为“分组依据”条件,影响查询结果。
您拥有的
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