mysql - 我想计算每月请求的休假列的总和

标签 mysql sql

empid   leavefrom     leaveto      leaverequested    
 1      3/3/2014     4/3/2014       2   
 1      7/3/2014     8/3/2014       2
 1      31/3/2014    1/4/2014       2
 1      10/4/2014    11/4/2014      2

我想计算leaverequested列的总和。

输出:

march -  5 days
april -  3 days

这是我到目前为止的 SQL 查询:

select Emp_id
  ,datename(month,leave_from) as [First]
  ,datename(month,leave_to) as Last
  ,count(DATEDIFF(Day, leave_from, leave_to)+1) as [Total Leave]
  ,sum(DATEDIFF(Day, leave_from, leave_to)+1) as [Total Days]
from emp_leave
group by Emp_id
        ,datename(month,leave_from)
        ,datename(month,leave_to);

有人可以帮我得到这个输出吗?

最佳答案

解决这个问题的一种方法

WITH n AS 
(
  SELECT 0 n
  UNION ALL
  SELECT n + 1 FROM n WHERE n < 32 -- adjust as needed to max months that a leave can possibly span
), base AS 
( 
  SELECT empid, 
         DATEADD(mm, n.n, DATEADD(mm, DATEDIFF(mm, 0, leavefrom), 0)) basemonth,
         CASE WHEN leavefrom > DATEADD(mm, n.n, DATEADD(mm, DATEDIFF(mm, 0, leavefrom), 0)) 
              THEN leavefrom 
              ELSE DATEADD(mm, n.n, DATEADD(mm, DATEDIFF(mm, 0, leavefrom), 0))
         END sdate, 
         CASE WHEN leaveto < DATEADD(mm, n.n, DATEADD(mm, DATEDIFF(mm, 0, leavefrom) + 1, -1)) 
              THEN leaveto 
              ELSE DATEADD(mm, n.n, DATEADD(mm, DATEDIFF(mm, 0, leavefrom) + 1, -1)) 
         END edate
    FROM emp_leave JOIN n
      ON n.n <= DATEDIFF(month, leavefrom, leaveto)
)
SELECT empid, 
       YEAR(basemonth) year,
       DATENAME(mm, basemonth) month,
       SUM(DATEDIFF(dd, sdate, edate) + 1) total
  FROM base
GROUP BY empid, basemonth
ORDER BY empid, base month

输出:

| EMPID | YEAR | MONTH | TOTAL |
|-------|------|-------|-------|
|     1 | 2014 | March |     5 |
|     1 | 2014 | April |     3 |

这里是SQLFiddle 演示

关于mysql - 我想计算每月请求的休假列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22279760/

相关文章:

mysql - SQL左连接和group_concat返回重复数据

php - 通过html形式在mysql中插入数据(以及更多..)

python - <键入 'exceptions.NameError' >

sql - 计算两个日期之间的第 90 个百分位数

c# - 由于 : Unable to load one or more of the requested types. 导致无法导出检索 LoaderExceptions 属性以获取更多信息。

c# - 我需要像树结构一样在下拉列表中显示数据,我尝试过但无法在 ASP.Net 中正确显示

sql - 将 MySQL 数据库迁移到 Sql Server

mysql - 如何让 vi 键绑定(bind)在 mysql 客户端中工作?

mysql - 将 Azure .bacpac 导出到 MySql .sql

php - 使用 pdo 和关系数据库获取行