为什么括号在此 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.5
或 0.05
。
为避免出现这种情况,您可以像您一样乘以一个实数:先 100.0
然后再除。
或者你可以这样做:
sum(case when elevation >= 2000 then 1.0 else 0.0 end)
结果是浮点数的总和。
在任何情况下都要确保除法的至少一个操作数是实数。
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.5
或 0.05
。
为避免出现这种情况,您可以像您一样乘以一个实数:先 100.0
然后再除。
或者你可以这样做:
sum(case when elevation >= 2000 then 1.0 else 0.0 end)
结果是浮点数的总和。
在任何情况下都要确保除法的至少一个操作数是实数。