返回选定值的新列

时间:2021-01-21 10:58:26

标签: sql aggregation

如何编写一个查询,将番石榴和浆果的数量固定为与 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

3 个答案:

答案 0 :(得分:1)

COUNT(fruits_opt = 'Guava') 没有按照您的想法行事。

fruits_opt = 'Guava' 返回 truefalse 但从不返回 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 被替换为 02 而不是 {{1} 时它返回相同的值}}:

NULL

非标准,依赖于隐式转换为 int:

COUNT(CASE WHEN fruits_opt =  'Guava' THEN 1 END) as Guava

非标准,使用 Postgres 简写进行显式转换(许多 Postgres 派生数据库支持 SUM( fruits_opt = 'Guava' ) as Guava ):

::
相关问题