按周分组数据,按工作日分组

时间:2017-10-13 13:45:54

标签: sql sql-server tsql date group-by

我有一个表格,其中包含针对以下任务记录的小时数据: 表1

| TaskID | DateRec    | Hours |
| 1      | 2017-10-08 | 3.5   |
| 1      | 2017-10-09 | 1     |
| 2      | 2017-10-09 | 5     |
| 1      | 2017-10-17 | 2.4   |
| 2      | 2017-10-17 | 2     |
| 5      | 2017-10-18 | 0.5   |
| 5      | 2017-10-19 | 2     |

TaskID和DateRec的组合始终是唯一的。假设我的工作周从周日开始,这意味着' 2017-10-08'将是第1周的第一天,' 2017-10-15'将是第2周的第一天,依此类推。我需要将我的小时数按任务ID和周分组,他们已登录,然后每个单独的一周将小时数从第1天到第7天按星期一天转换为七列,如下所示:

                 (10-08) (10-09) (10-10) (10-11) (10-12) (10-13) (10-14)
(Task 1, Week 1) (h)     (h)     (h)     (h)     (h)     (h)     (h)
(Task 2, Week 1) (h)     (h)     (h)     (h)     (h)     (h)     (h)
                 (10-15) (10-16) (10-17) (10-18) (10-19) (10-20) (10-21)
(Task 1, Week 2) (h)     (h)     (h)     (h)     (h)     (h)     (h)
(Task 2, Week 2) (h)     (h)     (h)     (h)     (h)     (h)     (h)
...

所以在我的例子中它将是:

    | TaskID | Week Start Date | Day1 | Day2 | Day3 | Day4 | Day5 | Day6 | Day7 |
    | 1      | 2017-10-08      | 3.5  | 1    | NULL | NULL | NULL | NULL | NULL |
    | 2      | 2017-10-08      | NULL | 5    | NULL | NULL | NULL | NULL | NULL |
    | 1      | 2017-10-15      | NULL | NULL | 2.4  | NULL | NULL | NULL | NULL |
    | 2      | 2017-10-15      | NULL | NULL | 2    | NULL | NULL | NULL | NULL |
    | 5      | 2017-10-15      | NULL | NULL | NULL | 0.5  | 2    | NULL | NULL |

是否可以使用SQL,具体如何?注意:我使用的是Microsoft SQL Server 2012。

1 个答案:

答案 0 :(得分:1)

示例

Select *
 From (
        Select TaskID
              ,WeekBeg = DateAdd(DAY,1-DatePart(WEEKDAY,DateRec),DateRec)
              ,Item    = Concat('Day',DatePart(WEEKDAY,DateRec))
              ,Hours
         From  YourTable
      ) A
 Pivot (sum([Hours]) For [Item] in ([Day1],[Day2],[Day3],[Day4],[Day5],[Day6],[Day7]) ) p

<强>返回

(无法重新加载图片... DateRec已重命名为WeekBeg

enter image description here