我已经为我的员工开发了一个计时应用程序,并且正在处理报告。我有下表。该应用的工作方式是在一天的开始插入第一时间。当他们更改状态时,它会插入先前状态的停止时间,以及新状态的新开始时间。一天结束时,他们选择的退出状态只会停留在停止时间。
Table Hours
┌────┬───┬──────────┬──────┬──────┬──────┐
│ id │emp│hDate │start │ stop │hHours│
├────┼───┼──────────┼──────┼──────┼──────┤
│ 100│ 20│10/21/2018│ 8:00 │ 16:00│ 8.0 │
│ 101│ 20│10/22/2018│ 8:00 │ 10:00│ 2.0 │
│ 102│ 22│10/22/2018│ 8:00 │ 9:00 │ 1.0 │
│ 103│ 20│10/22/2018│ 10:00│ 12:00│ 2.0 │
│ 104│ 20│10/22/2018│ 12:00│ 13:00│ 1.0 │
│ 105│ 22│10/22/2018│ 9:00 │ 12:00│ 3.0 │
│ 106│ 22│10/22/2018│ 12:00│ null │ null │
│ 107│ 20│10/22/2018│ 13:00│ null │ null │
└────┴───┴──────────┴──────┴──────┴──────┘
我要创建的报告是计算给定日期的工作时间。但是我不想在停止时间中包含任何具有NULL
值的日期。
SELECT hDate, SUM(hHours) as hHours
FROM tbl_Hours WHERE empID=20 and (hDate>='2018-10-15' and hDate<='2018-10-28')
GROUP BY hDate
ORDER BY hDate
我该怎么做?我不确定该去哪里甚至研究什么。
答案 0 :(得分:1)
不存在
select hDate,sum(hHours) as hHours
from Hours t where not exists
( select 1 from Hours t1
where t1.hDate = t.hDate and t1.stop is null
)
and t.emp = 20 and (hDate>='2018-10-15' and hDate<='2018-10-28')
group by hDate
答案 1 :(得分:1)
如何消除主查询中的那些行,如下所示? :
SELECT hDate, SUM(hHours) as hHours
FROM (select * from tbl_Hours where stop is not null) t WHERE empID=20 and (hDate>='2018-10-15' and hDate<='2018-10-28')
GROUP BY hDate
ORDER BY hDate
答案 2 :(得分:0)
选择相同的查询,其中hDate仅是stop中没有空值的日期:
SELECT hDate, SUM(hHours) as hHours
FROM tbl_Hours WHERE empID=20 and (hDate>='2018-10-15' and hDate<='2018-10-28')
AND hDate NOT IN (
SELECT
DISTINCT hDate
FROM
tbl_Hours
WHERE stop IS NULL;
)
GROUP BY hDate
ORDER BY hDate
与联接而不是内联表相同的查询:
SELECT hDate, SUM(hHours) as hHours
FROM tbl_Hours
LEFT JOIN (
SELECT
DISTINCT hDate
FROM
tbl_Hours
WHERE stop IS NULL;
) AS except_hDates
USING (hDate)
WHERE empID=20 and (hDate>='2018-10-15' and hDate<='2018-10-28')
AND except_hDates.hDate IS NULL
GROUP BY hDate
ORDER BY hDate