排除记录集中具有空值的记录

时间:2018-10-22 15:53:35

标签: sql

我已经为我的员工开发了一个计时应用程序,并且正在处理报告。我有下表。该应用的工作方式是在一天的开始插入第一时间。当他们更改状态时,它会插入先前状态的停止时间,以及新状态的新开始时间。一天结束时,他们选择的退出状态只会停留在停止时间。

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

我该怎么做?我不确定该去哪里甚至研究什么。

3 个答案:

答案 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

DEMO IN FIDDLE

答案 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