關於特殊動態表的豎錶轉橫表的處理方法(無法使用decode,case when)

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

最終查詢結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章