2014-06-12 135 views
2

我正在嘗試創建一個顯示員工工作時間的網格。轉軸日期到星期幾

這裏就是我的數據看起來像(簡體):

|ID |Client |Task |Hours |Date  | 
------------------------------------------ 
|1  |ABC |A  |3  |09/06/2014| 
|2  |ABC |A  |5  |09/06/2014| 
|3  |DEF |B  |8  |10/06/2014| 
|4  |DEF |C  |8  |11/06/2014| 
|5  |ABC |A  |8  |12/06/2014| 

而這裏的輸出必須是什麼樣子:

|Client |Task |Sun |Mon |Tue |Wed |Thu |Fri |Sat | 
-------------------------------------------------- 
|ABC |A | |3 | | |8 | | | 
|ABC |A | |5 | | | | | | 
|DEF |B | | |8 | | | | | 
|DEF |C | | | |8 | | | | 

我的問題是非常接近this one。但是有一個很大的區別:在我的情況下,對於Client-Task-Date的相同組合可能有多個值。

正如所期望的輸出顯示,員工將某個單獨的工作時間,即使他們的工作相同的客戶端和相同的任務,我不能使用聚合,因爲在網格中顯示的所有數據將是對互動最終用戶。

有沒有辦法獲得這種輸出使用樞軸或任何其他SQL機制,如CASE WHEN?

+0

您需要在子查詢和分區中使用'row_number()'客戶端,日期返回多個日期的行。 – Taryn

回答

1
WITH t AS (
    SELECT 
    Client, 
    Task, 
    Hours, 
    ROW_NUMBER() OVER(PARTITION BY Client,Task,Date ORDER BY Date) rn, 
    DATEPART(dw,date) DayOfWeek 
    FROM MyTable 
) 
SELECT Client, Task, [1] Sun, [2] Mon, [3] Tues, [4] Wed, [5] Thu, [6] Fri, [7] Sat 
FROM t 
PIVOT(SUM(Hours) FOR DayOfWeek IN ([1],[2],[3],[4],[5],[6],[7])) p 
+4

爲什麼凌亂的子串?爲什麼不只是'LEFT(DATENAME(WEEKDAY,date),3)'?如果在SQL Server 2012上,你也可以考慮'FORMAT(date,'ddd')'但是[CLR不是免費的](http://sqlperformance.com/2012/10/t-sql-queries/trim-time) 。此外,我建議遠離速記,它可以節省4微秒的打字次數,[但可能會導致問題](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to )使用-速記與 - 日期 - 時間 - operations.aspx -kick - 。 –

+0

@Aaron因爲它消除了對服務器或帳戶的區域設置的依賴。理想情況下,語言應該完全在客戶端處理,但是SUBSTRING方法比DATENAME更小。 – Anon

+0

如果他們*想*使用語言環境而不是被迫使用英語怎麼辦?如果這是你的理由,那麼你應該在你的回答中包含該描述,而不是僅僅傾銷沒有任何支持信息的代碼。 FWIW,你也可以用簡單的'SET LANGUAGE'命令強制英語。我仍然認爲這個子串解決方案 - 雖然稍微聰明一點 - 是sl and和不直觀的。 –