SQL进阶教程 1-6 关联子查询 练习题

1.简化多行数据的比较

  在“用列表展示与上一年的比较结果”部分,比较了企业每年的营业额与上一年相比是否增加。其实,第一条SQL的性能还有改善的余地,在三个WHEN子句里,同样的子查询执行了三次,请将他们整合在一个WHEN子句里。

  原SQL

SELECT S1.year,
CASE WHEN sale = (SELECT sale
                     FROM Sales S2
                     WHERE S2.year = S1.year - 1) THEN '' -- 持平
            WHEN sale > (SELECT sale
                         FROM Sales S2
                         WHERE S2.year = S1.year - 1) THEN '' -- 增长
            WHEN sale < (SELECT sale
                         FROM Sales S2
                         WHERE S2.year = S1.year - 1) THEN '' -- 减少
            ELSE '' END AS var
FROM Sales S1
ORDER BY year;

  我改善后的SQL:

SELECT S1.year, 
CASE WHEN S1.sale = S2.sale THEN '' -- 持平
     WHEN S1.sale > S2.sale THEN '' -- 增长
     WHEN S1.sale < S2.sale THEN '' -- 减少
     ELSE '' END AS var
FROM Sales S1, Sales S2
WHERE S2.year = S1.year - 1
ORDER BY year;

  依然没有整合到一个WHEN子句里面,怎么整合到一个WHEN子句里面呢?

 

二、使用OVERLAPS查询重叠的时间区间

  SQL-92提供了OVERLAPS谓词(ORACLE和PostgreSQL已经支持),目的正是用来查询重叠的时间区间。这个谓词的用法如下:

  (开始日期1,结束日期1)OVERLAPS(开始日期2,结束日期2)

 

三、在“移动累计值和移动平均值”部分介绍了求累计值的SQL语句,SUM函数可以计算出累计年营业额,AVG函数可以计算平均年营业额,换成MIN和MAX则可以计算出截止到当前年份,最大的营业额,最小营业额。

SELECT prc_date, A1.prc_amt,
(SELECT MAX(prc_amt)
FROM Accounts A2
WHERE A1.prc_date >= A2.prc_date ) AS onhand_max
FROM Accounts A1
ORDER BY prc_date;

  

 

  

posted @ 2019-07-22 16:55  Garcia11  阅读(662)  评论(0)    收藏  举报