SQL - Попытка посчитать записи на основе CASE WHEN (ПРОСТО?) - PullRequest
0 голосов
/ 09 апреля 2020

Чрезвычайно простой случай - я не могу правильно рассчитать количество месяцев для таблицы ниже - ожидаемое число 2, а не 3 - что интересно, "valueagg" рассчитывается правильно с тем же условием!

INSERT INTO ForgeRock
    ([productName], [description], [month], [value] )
VALUES
    ('OpenIDM', 'Y',1,33.2),
    ('OpenIDM', 'Y',2, 12.1),
    ('OpenIDM', 'Y',3, 1.1)
;

ТЕСТ

SELECT
  productName,
  description,
    sum(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) valueagg    --works
 ,count(CASE WHEN [MONTH] between 1 and 2 then [MONTH] else 0 end) month_count --doesn't work
 ,count(CASE WHEN [MONTH] between 1 and 2 then 1 else 0 end) month_count2      --doesn't work
FROM
  ForgeRock
  group by   productName,
  description

РЕЗУЛЬТАТ

| productName | description |           valueagg | month_count | month_count2 |
|-------------|-------------|--------------------|-------------|--------------|
|     OpenIDM |           Y | 45.300000000000004 |           3 |            3 |

http://sqlfiddle.com/#! 18/14603/3/0

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Удалите ELSE часть выражений CASE:

SELECT
  productName,
  description,
    sum(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) valueagg
    ,count(CASE WHEN [MONTH] between 1 and 2 then [MONTH] end) month_count
FROM
  ForgeRock
  group by   productName,
  description

или замените на SUM() следующим образом:

SELECT
  productName,
  description,
    sum(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) valueagg
    ,sum(CASE WHEN [MONTH] between 1 and 2 then 1 else 0 end) month_count
FROM
  ForgeRock
  group by   productName,
  description
0 голосов
/ 09 апреля 2020

Вы используете count() с else. count() подсчитывает количество не NULL значений, а - 0 точно так же, как "NULL", как и любое другое значение.

Вместо этого используйте sum():

SELECT productName, description,
       SUM(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) as valueagg    --works
       SUM(CASE WHEN [MONTH] between 1 and 2 then [MONTH] else 0 end) as month_count --doesn't work
       SUM(CASE WHEN [MONTH] between 1 and 2 then 1 else 0 end) month_count2      --doesn't work
FROM ForgeRock
GROUP BY productName, description

Или удалите ELSE из COUNT().

...