sql server 行轉列及列轉行的使用


在我們使用的數據庫表中經常需要用到行列互相轉換的情況,使用sql 的關鍵詞 UNPIVOT(列轉行)和PIVOT(行轉列)可輕松實現行列轉換。

一、列轉行:員工月份排班表存儲是采用1號~31號作為列的方式進行存儲的

 

 

現通過 UNPIVOT 將每天的班次用行進行展示,sql 如下:

SELECT distinct  t.Pb_Job_No,
t.Year_Month ,convert(int, REPLACE( t.day,'day','')) as  day,classno FROM Scheduling_Info
UNPIVOT(classno FOR day IN(Day1,Day2,Day3,Day4,Day5,Day6,Day7 ,Day8 ,Day9,Day10,
        Day11,Day12,Day13,Day14,Day15,Day16,Day17,Day18,Day19,Day20,
        Day21,Day22,Day23,Day24,Day25,Day26,Day27,Day28,Day29,Day30,Day31)) T      
where Year_Month='2020-05' and Pb_Job_No='0997' order by Pb_Job_No,day

這里的關鍵詞是

UNPIVOT(classno FOR day IN('日期列名') ,其中 ‘day’是存儲日期的列,classno 是存儲原有班次的列

查詢結果如下:

 

二、行轉列:如果將上述列轉行查詢的結果表定義為 Scheduling_DayInfo,進行逆轉為原始表,那么sql 語句為:

SELECT Pb_Job_No,[1],[2] ,[3] ,[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],
[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]
from 
Scheduling_DayInfo
 PIVOT (  max(classno) FOR [day]  IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],
[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])  ) 
t

結果為:

 

 此處的 in 必須是列 day 中的值,使用pivot 需要用到聚合函數 (sum,count,avg,max,min 等),使用的場景如考試成績 sum(score) ,年度銷售業績等,由於此處不需要統計但是又必須用聚合函數,所以使用max 湊合,因為這些函數可以接受字符類型的參數。

平時雖有用到這兩個函數 ,但是沒有總結,長時間不用就忘記如何使用了,所以今天記錄下來,加深印象並方便日后查看。

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM