编写以下SQL查询的更易读的方法

时间:2011-11-03 10:08:34

标签: sql sqlite

所以我要经历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

2 个答案:

答案 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)