Case 语句给出 group by 子句错误

Case statement gives group by clause error

以下查询:

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';

我收到这个错误:

Invalid operation: column "is_dog" must appear in the GROUP BY clause or be used in an aggregate function

我需要对此进行哪些更改?我刚开始使用 redshift。

应该写成

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';

在 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';

COUNT(*) 表达式在不同的列或不同的 CASE 表达式中不会不同。是行数,在外加上其他条件不会改变

此外,当您将所有行分组为一行时,您不能引用 is_catis_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_catis_dog 字段只有 01,您实际上甚至不需要 CASE 表达式所有...

SELECT
    SUM(is_dog) AS dogs,
    SUM(is_cat) AS cats
FROM
    animals
WHERE
    birth_date >= '2018-01-01'
;