我的任务是计算每位员工缺席天数的总数。
我写了以下查询
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'列生成。
你能为我们提供另一种解决方案吗?
?答案 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