T-SQL Два счета с разными предложениями where - PullRequest
0 голосов
/ 23 мая 2018

Я хочу посчитать значения в таблице с разными предложениями where и задаться вопросом, есть ли лучший способ сделать это.

В этом коде я считаю одно значение.

SELECT v.name, count(v.value) AS v1
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
AND v.value = 1
GROUP BY v.name

Я также хочу подсчитать все строки со значением = 2, мой способ сделать это с помощью подвыборки.

SELECT v.name, count(v.value) AS v1, (SELECT v2.name, count(v2.value)  
FROM dbo.table as v2
WHERE v2.organisationID = 2
AND v2.datecreated > '2018-01-01'
AND v2.datecreated < '2018-05-01'
AND v2.value = 2
GROUP BY v2.name) AS v2
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
AND v.value = 1
GROUP BY v.name

Таблица содержит> 100 миллионов строк, поэтому я действительно хочу самый быстрый способ.Я использую кластерный индекс columnstore для таблицы.

Есть ли способ сделать это без подвыбора.

Псевдокод:

SELECT v.name, count(v.value where v.value=1) AS v1, count(v.value where v.value=2) AS v2
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
GROUP BY v.name

1 Ответ

0 голосов
/ 23 мая 2018

Да, просто используйте выражение CASE:

SELECT  v.name, 
        SUM(CASE WHEN v.value = 1 THEN 1 ELSE 0 END) AS v1,
        SUM(CASE WHEN v.value = 2 THEN 1 ELSE 0 END) AS v2
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
AND v.value IN (1,2)
GROUP BY v.name
;
...