SQL Pivot на условном счете - PullRequest
       5

SQL Pivot на условном счете

0 голосов
/ 21 февраля 2020

У меня есть таблица уязвимостей с использованием SQL сервера, когда я выполняю следующий запрос

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

Но выходные данные имели правильную компоновку, но неверные данные, как если бы он считал только первое вхождение. Требуется ли поправка к счетному сроку или мой подход неправильный?

1 Ответ

1 голос
/ 21 февраля 2020

Условное агрегирование проще:

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 сделанный на заказ синтаксис, но он чувствителен к тому, какие столбцы находятся в таблице. Дополнительные столбцы интерпретируются как критерии «группировка», влияющие на результаты запроса.

...