为什么括号在此 sql 查询中有所不同

Why does the parenthesis make a different in this sql query

objective:

Find the percentage of high elevation airports (elevation >= 2000) by state from the airports table.

In the query, alias the percentage column as percentage_high_elevation_airports.

有人可以解释为什么以下 2 个 SQL 语句给出不同的结果:

正确结果:

SELECT state,
100.0 * sum(CASE WHEN elevation >= 2000 THEN 1 ELSE 0 END) / count(*)  as percentage_high_elevation_airports 
FROM airports 
GROUP BY state;

示例结果:

MS  0.0
MT  100.0
NC  11.1111111111111
ND  10.0

错误结果:

select 
state,
100.0 * (sum(case when elevation >= 2000 then 1 else 0 end)/count(*)) as percentage_high_elevation_airports
from airports
group by 1;

示例结果:

MS  0.0
MT  100.0
NC  0.0
ND  0.0

唯一的区别是在总和周围额外放置了 ()。

试试下面 - 您需要更改括号的位置

select 
state,
(100.0 * sum(case when elevation >= 2000 then 1 else 0 end))/count(*)) as percentage_high_elevation_airports
from airports
group by 1

我会这样写:

SELECT state,
       AVG(CASE WHEN elevation >= 2000 THEN 100.0 ELSE 0 END) as percentage_high_elevation_airports 
FROM airports 
GROUP BY state;

问题是整数算术。一些数据库进行整数除法,return 一个整数。所以,1/2 是 0 而不是 0.5。一些数据库也将此应用于 avg()(但甚至有些数据库对数值平均值进行整数除法)。

我应该注意,这是特定于数据库的。

你的问题不是关于another/better你的查询的解决方案
但是关于使用括号得到的错误结果,对吗?
因为:

sum(case when elevation >= 2000 then 1 else 0 end)

结果为整数 count(*) 根据定义是一个整数。
它们之间的除法是截断任何小数位的整数除法。
所以你得到 0 而不是 0.50.05
为避免出现这种情况,您可以像您一样乘以一个实数:先 100.0 然后再除。
或者你可以这样做:

sum(case when elevation >= 2000 then 1.0 else 0.0 end)

结果是浮点数的总和。
在任何情况下都要确保除法的至少一个操作数是实数