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;