【问题标题】:Get Month columns from datetime column and count entries从日期时间列获取月份列并计算条目
【发布时间】:2014-06-20 21:15:27
【问题描述】:

我有下表:

| ID | Name | DateA       | TimeToWork | TimeWorked |
|:--:|:----:|:----------:|:----------:|:----------:|
| 1  |Frank | 2013-01-01 |     8      |     5      |
| 2  |Frank | 2013-01-02 |     8      |     NULL   | 
| 3  |Frank | 2013-01-03 |     8      |     7      |
| 4  |Jules | 2013-01-01 |     4      |     9      |
| 5  |Jules | 2013-01-02 |     4      |     NULL   |
| 6  |Jules | 2013-01-03 |     4      |     3      |

表格很长,每个人一年中的每一天都有一个条目。对于每个人,我都有他工作的日期 (DateA)、他根据合同必须工作的时间 (TimeToWork) 和他的工作时间 (TimeWorked)。正如你所看到的,有些日子一个人在他不得不工作的日子里没有工作。这是一个人加班一整天的时候。

我试图完成的是从上面的第一个表格中得到下表。

| Name | January    | Feburary | March | ... | Sum |
|:----:|:----------:|:--------:|:-----:|:---:|:---:|
|Frank | 2          |     0    | 1     | ... | 12  |
|Jules | 5          |     1    | 3     | ... | 10  |

对于每个月,我想计算一个人休假一整天的所有天数,并在 Sum 列中进行汇总。

我尝试了Select (case when Datetime(month, DateA = 1 then count(case when timetowork - (case when timeworked then 0 end) = timetowork then 1 else 0 end) end) as 'January' 之类的方法,但我的 TSQL 不是那么好,而且代码根本不起作用。顺便说一句,我的选择命令大约有 40 行。

如果有人可以帮助我或给我一个好的来源的链接,我真的很感激。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    如果我对问题的理解正确,那么 Gordon Linoff 的回答是一个好的开始,但不涉及“全天休息”。

    select Name,
           sum(case when month(DateA) = 01 and TimeWorked is null then 1 else 0 end) as Jan,
           sum(case when month(DateA) = 02 and TimeWorked is null then 1 else 0 end) as Feb,
           ...
           sum(case when month(DeteA) = 12 and TimeWorked is null then 1 else 0 end) as Dec,
           sum(case when TimeWorked is null then 1 else 0 end) as Sum
    from table T
    where year(DateA) = 2013
    group by name
    

    这个方法能解决问题吗?

    【讨论】:

      【解决方案2】:

      正确的语法是条件聚合:

      select name,
             sum(case when month(datea) = 1 then timeworked else 0 end) as Jan,
             sum(case when month(datea) = 2 then timeworked else 0 end) as Feb,
             . . .
             sum(case when month(datea) = 12 then timeworked else 0 end) as Dec,
             sum(timeworked)
      from table t
      where year(datea) = 2013
      group by name;
      

      【讨论】:

        【解决方案3】:

        CASE 可以使用位逻辑删除

        SELECT name
             , January = SUM((1 - CAST(MONTH(DateA) - 1 as bit)) 
                           * (1 - CAST(COALESCE(TimeWorked, 0) as bit)))
             , February = SUM((1 - CAST(MONTH(DateA) - 2 as bit)) 
                            * (1 - CAST(COALESCE(TimeWorked, 0) as bit)))
             ...
             , December = SUM((1 - CAST(MONTH(DateA) - 12 as bit)) 
                            * (1 - CAST(COALESCE(TimeWorked, 0) as bit)))
             , Total = SUM((1 - CAST(COALESCE(TimeWorked, 0) as bit)))
        FROM   table1
        GROUP BY name;
        

        要检查是否有休息日,公式是:

        (1 - CAST(COALESCE(TimeWorked, 0) as bit))
        

        相当于TimeWorked IS NULLCASTBIT 为每个不同于 0 的值返回 1,1 - BIT 反转这些值。

        月份过滤器是:

        (1 - CAST(MONTH(DateA) - %month% as bit))
        

        使用与之前相同的想法,此公式仅在给定月份返回 1(演员每隔一个月返回 1,1 - BIT 反转该结果)

        将两个公式相乘,我们只在给定月份的休息日

        【讨论】:

          【解决方案4】:

          您也可以通过使用 pivot 来获得所需的结果。您可以在此处获取有关枢轴的更多信息http://technet.microsoft.com/en-in/library/ms177410(v=sql.105).aspx

          您还可以使用以下查询获取输出。我只做了到四月。您可以将其延长至 12 月。

          Select [Name], [January], [February], [March], [April]
          From
          (
          Select Name, MName, DaysOff from
          (
          select Name, DATENAME(MM, dateA) MName, 
              count(case isnull(timeworked,0) when 0 then 1 else null end) DaysOff
              from tblPivot
              Where Year(DateA) = 2013
              group by Name, DATENAME(MM, dateA)
          ) A ) As B
          pivot(Count(DaysOff)
          For  MName in ([January], [February],[March],[April])
          ) As Pivottable;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-08
            • 2021-08-19
            • 1970-01-01
            • 1970-01-01
            • 2018-10-15
            • 1970-01-01
            • 1970-01-01
            • 2011-04-02
            相关资源
            最近更新 更多