将日期转换为星期几

时间:2014-06-12 18:06:26

标签: sql sql-server pivot

我目前正在尝试创建一个显示员工工作时间的网格。

以下是我的数据(简化):

|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)获取此类输出?

1 个答案:

答案 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