- 時間:2017-09-11 整理:byzqy
題目:有個年度統計表,結構如下:

怎么樣把這個表,查詢成這樣一個結果:

這是在面試過程中遇到的一個關於數據庫的題,沒有一點思路,不知它考查到的知識點是什么,如何下手?
網上搜了一下,有哥們兒說這是典型的“行轉列問題”,好像用到“交叉表查詢”,下面看看具體的代碼!
文件:SQLQuery1.sql
/* 環境:Microsoft SQL Server 2012 工具: Microsoft SQL Server Management Studio 數據庫: Interview 數據表: statistic 詳情: year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 1992 4 2.4 (char(10)) (int) (float) 查詢成如下結果: year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4 */ --方法1 SELECT year, SUM ( CASE WHEN month = 1 THEN amount ELSE 0 END ) AS m1, SUM ( CASE WHEN month = 2 THEN amount ELSE 0 END ) AS m2, SUM ( CASE WHEN month = 3 THEN amount ELSE 0 END ) AS m3, SUM ( CASE WHEN month = 4 THEN amount ELSE 0 END ) AS m4 FROM statistic GROUP BY year -->查詢結果: year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4 --方法2 SELECT year, MAX(CASE month WHEN 1 THEN amount ELSE 0 END) m1, MAX(CASE month WHEN 2 THEN amount ELSE 0 END) m2, MAX(CASE month WHEN 3 THEN amount ELSE 0 END) m3, MAX(CASE month WHEN 4 THEN amount ELSE 0 END) m4 FROM statistic GROUP BY year -->查詢結果: year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4 --方法3 SELECT year, (SELECT amount FROM statistic m WHERE month=1 AND m.year=statistic.year) AS m1, (SELECT amount FROM statistic m WHERE month=2 AND m.year=statistic.year) AS m2, (SELECT amount FROM statistic m WHERE month=3 AND m.year=statistic.year) AS m3, (SELECT amount FROM statistic m WHERE month=4 AND m.year=statistic.year) AS m4 FROM statistic GROUP BY year -->查詢結果: year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4
運行結果:

代碼分解:
--方法1變形:將代碼中的0改為1,計算SUM,看看會發生什么 SELECT year, SUM ( CASE WHEN month = 1 THEN amount ELSE 1 END ) AS m1, SUM ( CASE WHEN month = 2 THEN amount ELSE 1 END ) AS m2, SUM ( CASE WHEN month = 3 THEN amount ELSE 1 END ) AS m3, SUM ( CASE WHEN month = 4 THEN amount ELSE 1 END ) AS m4 FROM statistic GROUP BY year -->查詢結果: year m1 m2 m3 m4 1991 4.1 4.2 4.3 4.4 1992 5.1 5.2 5.3 5.4 --方法2變形1:將MAX關鍵字換為MIN SELECT year, MIN(CASE month WHEN 1 THEN amount ELSE 0 END) m1, MIN(CASE month WHEN 2 THEN amount ELSE 0 END) m2, MIN(CASE month WHEN 3 THEN amount ELSE 0 END) m3, MIN(CASE month WHEN 4 THEN amount ELSE 0 END) m4 FROM statistic GROUP BY year -->查詢結果: year m1 m2 m3 m4 1991 0 0 0 0 1992 0 0 0 0 --方法2變形2:將MAX關鍵字換為MIN,並將0換為1 SELECT year, MIN(CASE month WHEN 1 THEN amount ELSE 1 END) m1, MIN(CASE month WHEN 2 THEN amount ELSE 1 END) m2, MIN(CASE month WHEN 3 THEN amount ELSE 1 END) m3, MIN(CASE month WHEN 4 THEN amount ELSE 1 END) m4 FROM statistic GROUP BY year -->查詢結果: year m1 m2 m3 m4 1991 1 1 1 1 1992 1 1 1 1 --方法2變形3:將MAX關鍵字換為SUM,並將0換為1 SELECT year, SUM(CASE month WHEN 1 THEN amount ELSE 1 END) m1, SUM(CASE month WHEN 2 THEN amount ELSE 1 END) m2, SUM(CASE month WHEN 3 THEN amount ELSE 1 END) m3, SUM(CASE month WHEN 4 THEN amount ELSE 1 END) m4 FROM statistic GROUP BY year -->查詢結果: year m1 m2 m3 m4 1991 4.1 4.2 4.3 4.4 1992 5.1 5.2 5.3 5.4
以上整理,如有錯誤之處或有更好的方法,請看到朋友不吝指正,謝謝!
參考文章:
https://zhidao.baidu.com/question/550776347.html
https://zhidao.baidu.com/question/486996750.html
https://www.zybang.com/question/0ac74f3ae058071e80274e23d5e1042a.html
