以前も少し学習しましたが、今回からはサブクエリの扱い方です。特に異なった行の比較(年度計算など)に関して行われる自己結合をつかったものが非常に強力です。
例によってここを学習しています。
下記のようなテーブル(sales)があるとします。
year | sale
——+——
1990 | 50
1991 | 51
1992 | 52
1993 | 52
1994 | 50
1995 | 50
1996 | 49
1997 | 55
自己結合覚えると楽ですね
例えば下記のSQLでまず8*8を作ります。
1 2 3 4 5 6 7 |
SELECT s1.year, s1.sale, s2.year as prev_year, s2.sale as prev_year FROM sales s1 ,sales s2 |
このうち、当然前年のものだけを見たいので、下記のような条件を作ります。(最初の年度は出ません)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT s1.year, s1.sale, s2.year as prev_year, s2.sale as prev_year, CASE WHEN (s1.sale - s2.sale ) > 0 THEN '↑' WHEN (s1.sale - s2.sale ) < 0 THEN '↓' ELSE '=' END AS var FROM sales s1 ,sales s2 WHERE s1.year -1 = s2.year |
こうしますと下記のような表がとれます。
year | sale | prev_year | prev_year | var
——+——+———–+———–+—–
1991 | 51 | 1990 | 50 | ↑
1992 | 52 | 1991 | 51 | ↑
1993 | 52 | 1992 | 52 | =
1994 | 50 | 1993 | 52 | ↓
1995 | 50 | 1994 | 50 | =
1996 | 49 | 1995 | 50 | ↓
1997 | 55 | 1996 | 49 | ↑
自己結合非常にわかりやすいですね・・・。最初見たときは何に使うんだろう・・と思っていましたが、集合の考え方をイメージするのに非常に
またサブクエリで書く場合は下記のようになりますが、自己結合をイメージに持っておくと非常に考えやすいです。
1 2 3 4 5 6 7 8 9 |
SELECT s1.year, s1.sale, CASE WHEN s1.sale > ( SELECT s2.sale FROM sales s2 WHERE s2.year = s1.year -1 ) THEN '↑' WHEN s1.sale < ( SELECT s2.sale FROM sales s2 WHERE s2.year = s1.year -1 ) THEN '↓' ELSE '-' END var FROM sales s1 |