“生成”列上的SQL SUM

时间:2014-05-09 13:41:14

标签: mysql sql

我的任务是计算每位员工缺席天数的总数。

我写了以下查询

SELECT name
    ,surname
    ,absentdays
FROM (
    SELECT name
        ,surname
        ,DATEDIFF("d", fromdate, todate) AS absentdays
    FROM DiseaseReport D
        , Employees E
    WHERE E.number = D.empnumber
    )

虽然这个查询工作得很好,但它并没有给我提供全部' TOTAL'每位员工缺席天数。相反,我会为每位员工获得更多行(如果适用)。

我尝试应用SUM(absentdays)或GROUP BY'名称'但我猜测这些是没有选项,因为“absentdays'列生成。

你能为我们提供另一种解决方案吗?

6 个答案:

答案 0 :(得分:1)

将函数(在您的情况下为sum)应用于“生成”列没有任何问题:

SELECT   name,
         surname,
         SUM(absentdays) AS total_absent_days
FROM     (SELECT name, 
                 surname,
                 DATEDIFF("d", fromdate, todate) AS absentdays
          FROM   DiseaseReport D, Employees E
          WHERE  E.number = D.empnumber
         )
GROUP BY name, surname

答案 1 :(得分:0)

为什么在只使用内部选择时会有冗余的select语句?

只需删除

以外的所有内容
SELECT name
    ,surname
    ,DATEDIFF("d", fromdate, todate) AS absentdays
FROM DiseaseReport D
    , Employees E
WHERE E.number = D.empnumber ;

答案 2 :(得分:0)

SELECT CONCAT(name,' ',surname) as fullName, sum(DATEDIFF("d", fromdate, todate)) as totalAbsendDays
FROM DiseaseReport D, Employees E
WHERE E.number = D.empnumber
GROUP BY fullName

答案 3 :(得分:0)

它产生的事实无关紧要。只需确保外部select中的每一列都在group by子句中或使用聚合函数(在本例中为SUM)

SELECT name
    ,surname
    ,SUM(absentdays) 
FROM (
    SELECT name
        ,surname
         ,DATEDIFF("d", fromdate, todate) AS absentdays
    FROM DiseaseReport D
        , Employees E
    WHERE E.number = D.empnumber
    )
GROUP BY name, surname

答案 4 :(得分:0)

已经有很多答案了。从 MySQL 数据库中获取指定结果的最佳查询(如问题被标记)将是这样的:

SELECT e.name
     , e.surname
     , SUM(DATEDIFF(d.todate,d.fromdate)) AS total_absentdays
  FROM Employees e
  JOIN DiseaseReport d
    ON d.empnumber = e.number
 GROUP BY e.surname, e.name

这将仅返回在DiseReport表中至少有一行的Employees中的行。如果您还想包括缺少零的员工,请在LEFT之前添加关键字JOIN以使其成为外部联接操作,并返回零代替NULL,将total_absentdays表达式包装在IFNULL( expr, 0)

这个相同的基本查询将在除 MySQL 之外的数据库(例如Oracle和SQL Server)中起作用,但表达式除外,它将导致"天数差异,#34;是的, MySQL DATEDIFF()函数需要替换为适合每个数据库的语法。

要从 SQL Server 获得等效结果,DATEDIFF函数将获取三个参数,其中较早的日期在较晚的日期之前,以获得非负值:

SELECT e.name
     , e.surname
     , SUM(DATEDIFF('DAY',d.fromdate,d.todate)) AS total_absentdays
  FROM Employees e
  JOIN DiseaseReport d
    ON d.empnumber = e.number
 GROUP BY e.surname, e.name
 ORDER BY e.surname, e.name

注意:

不需要内联视图来获取指定的结果。

抛弃连接操作的旧学校逗号语法,改为使用JOIN关键字,并将连接谓词重定位到ON子句。

MySQL DATEDIFF()函数接受两个参数,并返回两个日期值之间的整数天数。要让函数返回一个非负整数值,"稍后" date应该是第一个参数,"更早"日期应该是第二个。

此外,最佳做法是使用分配给表的别名完全限定所有列引用。这使读者更容易阅读和解密SQL ...读者不知道这个名字是不是'来自疾病报告或员工的专栏。

使用MySQL,GROUP BY子句意味着ORDER BY子句。如果您希望结果的顺序不同,则添加ORDER BY子句。

答案 5 :(得分:0)

很可能会有多名同名+姓氏的员工, 因此请使用e.number进行区分:

SELECT e.surname
    ,e.name
    ,e.number
    ,SUM(DATEDIFF("d", d.fromdate, d.todate)) AS _sickdays 
FROM Employees     AS e
JOIN DiseaseReport AS d ON d.empnumber = e.number
GROUP BY number
ORDER BY surname, name, number