我目前正在尝试创建一个显示员工工作时间的网格。
以下是我的数据(简化):
|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的相同组合,可能有多个值。
如所需的输出所示,员工有时会分开他们的工作时间,即使他们在同一个客户端工作并且在同一个任务上也不能使用聚合,因为网格中显示的所有数据都将与最终用户。
有没有办法使用pivot或任何其他SQL机制(如CASE WHEN)获取此类输出?
答案 0 :(得分: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