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 的用法。僅為借鑑,如有錯誤請指教。