1. 程式人生 > >sql 行轉列並更改列名(實際應用並截圖)

sql 行轉列並更改列名(實際應用並截圖)

這裡是一個實際應用的例子,一開始的資料是錯綜複雜的,如下圖所示,實際很多月份很多的型別,需要的是得到每個部門不同了型別不同月份的實際金額,這兒就用到了行轉列的寫法,百度了一下確實有效,成功之後的顯示欄位確實1,2,3,4....這種的,最好變為january,february...的這種所以就用了宣告並賦值加case when 的寫法順便吧null的值變為0;在此做下記錄,希望也可以幫到用到的人。

下圖的sql是這樣子的:(這是一個union al l聯立的多個表)

 select year(ExpenseDate) as NowYear,ExpenseDept,AccountMonth,ISNULL(AccountMoney,0) as monthmoney,'差旅費' as FYType FROM  CW_WY_TravelExpenseBill_M m  inner join  BPMDB..BPMInstTasks s on m.TaskID = s.TaskID where (s.State='Approved' or s.State='Running')
     union all
     select  year(ExpenseDate)as NowYear,ExpenseDept,AccountMonth,ISNULL(AccountMoney,0) as monthmoney,'日常費用' as FYType FROM  CW_WY_DailyLiveExpenseBill_M m  inner join  BPMDB..BPMInstTasks s on m.TaskID = s.TaskID where (s.State='Approved' or s.State='Running')
     union all
     select NowYear,deptname,NowMonth,ISNULL(PayMoney,0) as monthmoney,FeiYongType as FYType   from CW_WY_DailyLiveExpenseFuKuan_T m inner join  BPMDB..BPMInstTasks s on m.TaskID = s.TaskID where (s.State='Approved' or s.State='Running')

要形成下圖這樣的效果sql需要有所改動:

SELECT NowYear,ExpenseDept,FYType,January=case when [1]  is null then 0 else [1] end,February=case when [2] is null then 0 else [2] end,March=case when [3] is null then 0 else [3] end,April=case when [4] is null then 0 else [4] end,May=case when [5] is null then 0 else [5] end,June=case when [6] is null then 0 else [6] end,July=case when [7] is null then 0 else [7] end,August=case when [8] is null then 0 else [8] end,September=case when [9] is null then 0 else [9] end,  Octorber=case when [10] is  null then 0 else [10] end,November=case when [11] is null then 0 else [11] end,December=case when [12] is null then 0 else [12] end  FROM (
     select year(ExpenseDate) as NowYear,ExpenseDept,AccountMonth,ISNULL(AccountMoney,0) as monthmoney,'差旅費' as FYType FROM  CW_WY_TravelExpenseBill_M m  inner join  BPMDB..BPMInstTasks s on m.TaskID = s.TaskID where (s.State='Approved' or s.State='Running')
     union all
     select  year(ExpenseDate)as NowYear,ExpenseDept,AccountMonth,ISNULL(AccountMoney,0) as monthmoney,'日常費用' as FYType FROM  CW_WY_DailyLiveExpenseBill_M m  inner join  BPMDB..BPMInstTasks s on m.TaskID = s.TaskID where (s.State='Approved' or s.State='Running')
     union all
     select NowYear,deptname,NowMonth,ISNULL(PayMoney,0) as monthmoney,FeiYongType as FYType   from CW_WY_DailyLiveExpenseFuKuan_T m inner join  BPMDB..BPMInstTasks s on m.TaskID = s.TaskID where (s.State='Approved' or s.State='Running')
 ) /*資料來源*/
AS P
PIVOT 
(
    SUM(monthmoney/*行轉列後 列的值*/) FOR 
    p.AccountMonth/*需要行轉列的列*/ IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]/*列的值*/)
) AS T

主要是兩個知識點:行轉列的寫法和case when 的用法。僅為借鑑,如有錯誤請指教。