■ サンプル1:変化(増加/変化なし/減少)
使用テーブル / データ
* Oracle 11g
テーブル -- 年間売上
CREATE TABLE "SALES"
(
"YEAR" INT,
"SALE" INT,
PRIMARY KEY ("YEAR")
);
# DROP TABLE SALES;
データ INSERT INTO SALES VALUES(2000, 1280);
INSERT INTO SALES VALUES(2001, 1220);
INSERT INTO SALES VALUES(2002, 1470);
INSERT INTO SALES VALUES(2003, 1310);
INSERT INTO SALES VALUES(2004, 1310);
INSERT INTO SALES VALUES(2005, 1920);
INSERT INTO SALES VALUES(2006, 1680);
INSERT INTO SALES VALUES(2007, 1790);
INSERT INTO SALES VALUES(2008, 2170);
INSERT INTO SALES VALUES(2009, 1810);
INSERT INTO SALES VALUES(2010, 1810);
-- 例1-2用の追加データ()
INSERT INTO SALES VALUES(2011, 1420);
INSERT INTO SALES VALUES(2013, 1720);
INSERT INTO SALES VALUES(2014, 1640);
INSERT INTO SALES VALUES(2017, 2310);
INSERT INTO SALES VALUES(2018, 2810);
確認用 select文 SELECT * FROM SALES;
YEAR SALE
2000 1280
2001 1220
2002 1470
2003 1310
2004 1310
2005 1920
2006 1680
2007 1790
2008 2170
2009 1810
2010 1810
【例1-1】年間売上の変化(増加/変化なし/減少)
SELECT
S1.YEAR AS YEAR,
CASE WHEN S1.SALE = S2.SALE THEN '→'
WHEN S1.SALE > S2.SALE THEN '↑'
WHEN S1.SALE < S2.SALE THEN '↓'
ELSE '-' END AS UP_OR_DOWN,
S1.SALE AS SALE,
S2.SALE AS PREVIOUS_SALE,
S1.SALE - S2.SALE AS DIFF
FROM
SALES S1
LEFT OUTER JOIN
SALES S2
ON
S1.YEAR = S2.YEAR + 1
ORDER BY
YEAR;
出力結果 YEAR UP_OR_DOWN SALE PREVIOUS_SALE DIFF
2000 - 1280 « NULL » « NULL »
2001 ↓ 1220 1280 -60
2002 ↑ 1470 1220 250
2003 ↓ 1310 1470 -160
2004 → 1310 1310 0
2005 ↑ 1920 1310 610
2006 ↓ 1680 1920 -240
2007 ↑ 1790 1680 110
2008 ↑ 2170 1790 380
2009 ↓ 1810 2170 -360
2010 → 1810 1810 0
参考文献 https://codezine.jp/article/detail/907【例1-2】年間売上の変化(増加/変化なし/減少。歯抜けデータ)
■ サンプル2:性別・部署別の最高齢
使用テーブル / データ
* MySQL
テーブル -- 従業員
CREATE TABLE Employees
(
id char(4) NOT NULL,
name varchar(20) NULL,
departmentId char(4) NULL,
bossId char(4) NULL,
sex char(1) NULL, -- m : male, f : famale
birthDate Date NULL
)
-- 部署
CREATE TABLE Departments
(
id char(4) NOT NULL,
name varchar(20) NULL,
)
データ INSERT INTO Employees VALUES('1000', 'Robin','D000', NULL, 'm', '1973-5-6')
INSERT INTO Employees VALUES('1001', 'Mike','D001', NULL, 'm', '1945-11-9')
INSERT INTO Employees VALUES('1002', 'Tony','D000', NULL, 'm', '1965-1-12')
INSERT INTO Employees VALUES('1003', 'Claire','D001', '1001', 'f', '1987-9-22')
INSERT INTO Employees VALUES('1004', 'John','D002', '1002', 'm', '1972-4-2')
INSERT INTO Employees VALUES('1005', 'Ken','D002', '1001', 'm', '1982-12-22')
INSERT INTO Employees VALUES('1006', 'Hilary','D001', '1003', 'f', '1979-9-9')
INSERT INTO Employees VALUES('1007', 'Becky','D000', '1007', 'f', '1980-3-2')
INSERT INTO Employees VALUES('1008', 'Anne','D002', '1007', 'f', '1969-1-31')
INSERT INTO Employees VALUES('1007', 'Steve','D000', NULL, 'm', '1955-2-24')
INSERT INTO Employees VALUES('1008', 'Thomas','D001', '1007', 'm', '1959-9-12')
INSERT INTO Departments VALUES('D000', 'IT')
INSERT INTO Departments VALUES('D001', 'Sales')
INSERT INTO Departments VALUES('D002', 'Accounting')
確認用 select文 SELECT
E1.Id,
E1.name,
D.name,
E1.bossId,
E1.sex,
E1.birthDate,
((CONVERT(INT,CONVERT(VARCHAR(8),GETDATE(),112)) - CONVERT(INT,CONVERT(VARCHAR(8),E1.birthDate,112))) / 10000) AS age
FROM
Employees E1
INNER JOIN
Departments D
ON
E1.departmentId = D.id
出力結果 Id name name bossId sex birthDate age
1000 Robin IT NULL m 1973-05-06 42
1001 Mike Sales NULL m 1945-11-09 70
1002 Tony IT NULL m 1965-01-12 51
1003 Claire Sales 1001 f 1987-09-22 28
1004 John Accounting 1002 m 1972-04-02 43
1005 Ken Accounting 1001 m 1982-12-22 33
1006 Hilary Sales 1003 f 1979-09-09 36
1007 Becky IT 1007 f 1980-03-02 35
1008 Anne Accounting 1007 f 1969-01-31 46
1007 Steve IT NULL m 1955-02-24 60
1008 Thomas Sales 1007 m 1959-09-12 56
【例2-2】性別別の最高齢
SELECT
E1.Id,
E1.name,
D.name,
E1.bossId,
E1.sex,
E1.birthDate,
((CONVERT(INT,CONVERT(VARCHAR(8),GETDATE(),112)) - CONVERT(INT,CONVERT(VARCHAR(8),E1.birthDate,112))) / 10000) AS age
FROM
Employees E1
INNER JOIN
Departments D
ON
E1.departmentId = D.id
WHERE
((CONVERT(INT,CONVERT(VARCHAR(8),GETDATE(),112)) - CONVERT(INT,CONVERT(VARCHAR(8),E1.birthDate,112))) / 10000) =
(SELECT MAX((CONVERT(INT,CONVERT(VARCHAR(8),GETDATE(),112)) - CONVERT(INT,CONVERT(VARCHAR(8),E2.birthDate,112))) / 10000)
FROM Employees E2 WHERE E1.sex = E2.sex
)
【例2-2】部署別の最高齢
SELECT
E1.Id,
E1.name,
D.name,
E1.bossId,
E1.sex,
E1.birthDate,
((CONVERT(INT,CONVERT(VARCHAR(8),GETDATE(),112)) - CONVERT(INT,CONVERT(VARCHAR(8),E1.birthDate,112))) / 10000) AS age
FROM
Employees E1
INNER JOIN
Departments D
ON
E1.departmentId = D.id
WHERE
((CONVERT(INT,CONVERT(VARCHAR(8),GETDATE(),112)) - CONVERT(INT,CONVERT(VARCHAR(8),E1.birthDate,112))) / 10000) =
(SELECT MAX((CONVERT(INT,CONVERT(VARCHAR(8),GETDATE(),112)) - CONVERT(INT,CONVERT(VARCHAR(8),E2.birthDate,112))) / 10000)
FROM Employees E2 WHERE E1.departmentId = E2.departmentId
)