2012年6月8日 星期五

SQL資料轉行

最近遇到SQL SERVER篩選資料時

需要將資料做列轉行(行轉列)的動作

問題:
篩選出每個人在指定 年/月 的每天工作時數

下圖中
上面的是原始資料儲存方式
下面是要秀出來的畫面


試了很多方式

最後找到SQL SERVER 2005以上才有支援的功能

SQL語法:



select 姓名,(case [1]when [1] then [1] else 0 end) as[1],
  (case [2]when [2] then [2] else 0 end) as[2],...
    --顯是最後結果
    --因為會有休假日,所以當該天為NULL則顯示
    from(
        select 姓名,day(日期) as 日期,工作時數
        --原始資料顯示為年-月-日,只顯示一個月的每天工作時數,所以只取日
        from 工作時數紀錄
        where year(日期) = 年and month(日期) = 月
    ) as t
    PIVOT
    (
        sum(工作時數)  --這邊是要顯示的資料,不能直接指定欄位名稱,可以用SUM或MAX等等來做
        for 日期in([1],[2],...)  --指定轉換的欄位名稱
    ) as p

先將資料篩選出來

再利用PIVOT去將資料做轉換

最後將轉換後資料顯示為結果

很輕鬆的就完成轉換的動作


注意:
for 欄位 in (欄位名稱1,欄位名稱2,欄位名稱3,....)
這邊括號內設定的欄位名稱要等於篩選出來的所有資料指定欄位內容一樣
如果不同就會顯示NULL
沒有設定到又不會顯示
所以當資料是很隨機的時候
就需要將語法轉成字串
並且在設定欄位的時候將隨機值指定為要顯示的欄位
然後再執行該字串

改天有空再補充進來

回sql目錄
回首頁



沒有留言 :

張貼留言

Related Posts Plugin for WordPress, Blogger...