如何编写一个查询,将番石榴和浆果的数量固定为与 no_of_fruits 相同的数量? Guava 和 Berry 有自己的号码。
附注。 Fruits_opt 列有两个值(番石榴和浆果)
SELECT
DATETRUNC(date_ts,'dd') AS day,
COUNT(sold_fruits) AS no_of_fruits_sold,
COUNT( fruits_opt = 'Guava')AS Guava,
COUNT( fruits_opt = 'Berry')AS Berry
FROM beginner_1
GROUP BY DATETRUNC(date_ts,'dd')
ORDER BY DATETRUNC(date_ts,'dd');
当前结果:
天 | no_of_fruits_sold | 番石榴 | 浆果 |
---|---|---|---|
2021-01-06 00:00:00 | 120 | 120 | 120 |
2021-01-07 00:00:00 | 50 | 50 | 50 |
2021-01-08 00:00:00 | 100 | 100 | 100 |
2021-01-09 00:00:00 | 80 | 80 | 80 |
想要的结果:
天 | no_of_fruits_sold | 番石榴 | 浆果 |
---|---|---|---|
2021-01-06 00:00:00 | 120 | 80 | 40 |
2021-01-07 00:00:00 | 50 | 19 | 31 |
2021-01-08 00:00:00 | 100 | 67 | 33 |
2021-01-09 00:00:00 | 80 | 52 | 28 |
答案 0 :(得分:1)
COUNT(fruits_opt = 'Guava')
没有按照您的想法行事。
fruits_opt = 'Guava'
返回 true
或 false
但从不返回 null
,因此所有行都被计算在内。并且 count<expression>)
计算 <expression>
不为空的所有行
使用过滤聚合:
count(*) filter (where fruits_opt = 'Guava')
答案 1 :(得分:0)
您不能在布尔表达式上使用 count()。当您的条件为真时,用例计数 1。如果条件为假,则返回 null。以下查询应符合您的目的:
SELECT
DATETRUNC(date_ts,'dd') AS day,
COUNT(sold_fruits) AS no_of_fruits_sold,
COUNT( case when fruits_opt = 'Guava' then 1 end)AS Guava,
COUNT( case when fruits_opt = 'Berry' then 1 end)AS Berry
FROM beginner_1
GROUP BY DATETRUNC(date_ts,'dd')
ORDER BY DATETRUNC(date_ts,'dd');
答案 2 :(得分:0)
你还没有说明你使用的是什么数据库,所以这里有一个选项纲要。
标准 SQL,但在许多数据库中不支持:
COUNT(*) FILTER (WHERE fruits_opt = 'Guava') AS Guava,
标准 SQL,处处支持,但冗长:
SUM(CASE WHEN fruits_opt = 'Guava' THEN 1 ELSE 0 END) as Guava
标准 SQL,到处都支持,但很冗长,我发现代码有点误导,因为当 1
被替换为 0
或 2
而不是 {{1} 时它返回相同的值}}:
NULL
非标准,依赖于隐式转换为 int:
COUNT(CASE WHEN fruits_opt = 'Guava' THEN 1 END) as Guava
非标准,使用 Postgres 简写进行显式转换(许多 Postgres 派生数据库支持 SUM( fruits_opt = 'Guava' ) as Guava
):
::