Оператор case дает ошибку group by - PullRequest
0 голосов
/ 29 ноября 2018

Следующий запрос:

SELECT 
    CASE WHEN is_dog = 1 THEN COUNT(*) END AS dogs,
    CASE WHEN is_cats = 1 THEN count(*) END as cats
FROM 
    animals
WHERE
    birth_date >= '2018-01-01';

Я получаю эту ошибку:

Недопустимая операция: столбец "is_dog" должен появляться в предложении GROUP BY или использоваться в агрегатефункция

Что мне нужно изменить в этом?Я новичок в использовании красного смещения.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

В Amazon Redshift вы, вероятно, захотите:

SELECT SUM(case when is_dog = 1 then 1 else 0 END) AS dogs,
       SUM(case when is_cats = 1 then then 1 else 0 end)  as cats
FROM animals
WHERE birth_date >= '2018-01-01';

Или более короткая форма:

SELECT SUM( (is_dog = 1)::int ) AS dogs,
       SUM( (is_cats = 1)::int )  as cats
FROM animals
WHERE birth_date >= '2018-01-01';

Или если столбцы принимают только 0/1 / NULL, то:

SELECT SUM( is_dog ) AS dogs,
       SUM( is_cats )  as cats
FROM animals
WHERE birth_date >= '2018-01-01';
0 голосов
/ 29 ноября 2018

Выражение COUNT(*) не будет отличаться в разных столбцах или в разных выражениях CASE.Это число строк, и оно не изменится, если поместить другие условия вне .

Кроме того, поскольку вы группируете все строки в одинстрока, вы не можете ссылаться на is_cat или is_dog, если только эта ссылка не находится внутри агрегатной функции (например, SUM() или COUNT()) .

Приведите эти двафакты вместе, и вы можете делать такие вещи, как ...

  • SUM(CASE WHEN is_dog = 1 THEN 1 ELSE 0 END)

Что дает запрос типа...

SELECT
    SUM(CAST WHEN is_dog = 1 THEN 1 ELSE 0 END) AS dogs,
    SUM(CAST WHEN is_cat = 1 THEN 1 ELSE 0 END) AS cats
FROM
    animals
WHERE
    birth_date >= '2018-01-01';

Или, предполагая, что поля is_cat и is_dog содержат только 0 или 1, вам даже не нужно вообще выражение CASE ...

SELECT
    SUM(is_dog) AS dogs,
    SUM(is_cat) AS cats
FROM
    animals
WHERE
    birth_date >= '2018-01-01'
;
0 голосов
/ 29 ноября 2018

Это должно быть записано как

SELECT count(*) FILTER (WHERE is_dog = 1) AS dogs,
       count(*) FILTER (WHERE is_cat = 1) AS cats
FROM animals
WHERE birth_date >= '2018-01-01';
...