1、目前常用的豎錶轉橫表方法爲:decode,case when,decode適用於條件比較單一的業務場景,case when 適用於條件限制比較的業務場景,但是這兩種寫法都必需有一個前天,就是列數據是固定的,可以通過判定進行轉換成行形式的表頭。比如常用舉例的學生的各個學科數據,都是固定的chinese,math,english等等。
2、但是當數據是不固定的時候,很難通過判斷相等,將表數據進行豎錶轉橫表
具體業務場景如下hengz
項目project_id | 年份 predict_year | 預算_predict_cost |
1 | 2018 | 200 |
1 | 2019 | 300 |
1 | 2020 | 400 |
2 | 2008 | 55 |
2 | 2009 | 66 |
2 | 2010 | 77 |
希望轉換出來的結果是:
項目project_id | 第一年 | 第二年 | 第三年 |
1 | 2018:200 | 2019:300 | 2020:400 |
2 | 2008: | 2009:55 | 2010:77 |
我們注意到:按照普通的豎錶轉橫表,首先predict_year就不滿足基本條件,因爲項目1第一年爲2018,項目2第一年爲2008,爲了適用,我們必須把年份轉換爲通用的‘第一年’,‘第二年’,‘第三年’,但是結果如果只有預算,查詢的數據也會讓人不明白,因此做一個年份與預算的拼接作爲結果。如何寫這個sql?
核心:找到所有項目的最小年份,然後依次累加得到以後依次的年份
這裏做了個巧妙的子查詢連表,以
(select aa.PROJECT_RECID, min(aa.predict_year) as minq
from TPROJECT aa
group by aa.PROJECT_RECID) b --查詢項目最小年份作爲子表
作爲子表與項目表數據進行連接查詢,並在select每項中做子查詢
最終sql:
select distinct a.PROJECT_RECID,--去重
(select c.predict_year || '年:' ||c.predict_cost
from TPROJECT c
where c.PROJECT_RECID = a.PROJECT_RECID
and c.predict_year = b.minq) predict_year1,--根據主子表,作爲條件 查詢結果進行評價
(select c.predict_year || '年:' ||c.predict_cost
from TPROJECT c
where c.PROJECT_RECID = a.PROJECT_RECID
and c.predict_year = (b.minq +1)) predict_year2,
(select c.predict_year || '年:' ||c.predict_cost
from TPROJECT c
where c.PROJECT_RECID = a.PROJECT_RECID
and c.predict_year = (b.minq +2)) predict_year3
from TPROJECT a,
(select aa.PROJECT_RECID, min(aa.predict_year) as minq
from TPROJECT aa
group by aa.PROJECT_RECID) b --查詢項目最小年份作爲子表
where a.PROJECT_RECID = b.PROJECT_RECID
最終查詢結果: