所以我要经历Stanford's DB class,并在其中一个问题上给出以下database。现在,我已经让我的代码工作了,但它让我觉得非常低效。我们使用SQLite来执行查询。
有什么方法可以用更流畅和可读的方式编写以下内容吗?具体来说,我讨厌两次复制和粘贴我的平均值表。
以下不是确切的代码本身,因为我不想破坏荣誉代码。但是,我有一个Averages表,以及平均值显示在下面的任何地方,我实际上是复制并粘贴整个SELECT查询。有什么方法可以避免这种情况吗?
SELECT avgbefore-avgafter
FROM
(SELECT avg(avgs) as avgbefore
FROM
Averages
WHERE year < 1980) as Before,
(SELECT avg(avgs) as avgafter
FROM
Averages
WHERE year >= 1980) as After
答案 0 :(得分:3)
我不知道SQLite是否支持ANSI CASE语句,但是如果它确实尝试以下内容:
SELECT avgbefore - avgafter
FROM (
SELECT avg(CASE WHEN year < 1980 THEN avgs ELSE null END) as avgbefore,
avg(CASE WHEN year >= 1980 THEN avgs ELSE null END) as avgafter
FROM averages
) t
这使用聚合函数不考虑NULL值的事实。
答案 1 :(得分:1)
这是您已经拥有的相同查询,它直接在子查询上计算的细微更改,而不是使用创建派生表的from子句。它不涉及在多个地方使用表averages
,但它可能更具可读性。
SELECT (SELECT AVG(avgs)
FROM averages
WHERE YEAR < 1980) - (SELECT AVG(avgs)
FROM averages
WHERE YEAR >= 1980)