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_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'
;
以下查询:
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_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'
;