SQL如何每人每天只计算一次列中的唯一值

时间:2017-10-30 21:17:51

标签: mysql sql

我有一个SQL表格,显示扫描条形码的人的姓名。 他们经常每天扫描到多个条形码,有时在同一天扫描相同的代码。 我需要计算每个人每天的扫描类型数量。 我遇到的问题是我不想每天为一个人计算相同的条形码值。

以下是SQL表的示例。

Example SQL Table

这是我的SQL

SELECT EVENTDATE, BARCODE, count(BARCODE) AMOUNT
from TIMESHEET
where EVENTDATE = '27-OCT-17' 
group by EVENTDATE, BARCODE
order by EVENTDATE, BARCODE

结果给我的数量为5,但我只想要4,因为同一天有两个重复的条形码扫描为JOHN SMITH。

3 个答案:

答案 0 :(得分:2)

请改为计算DISTINCT名称。

SELECT EVENTDATE, BARCODE, count(DISTINCT NAME) AMOUNT
from TIMESHEET
where EVENTDATE = '27-OCT-17' 
group by EVENTDATE, BARCODE
order by EVENTDATE, BARCODE;

但是你应该使用一些name_id而不是name,因为你可以有两个人名Jhon Smith

答案 1 :(得分:1)

也许你只是想要:

select EVENTDATE, NAME, count(DISTINCT BARCODE) as cnt
from TIMESHEET
where EVENTDATE = '27-OCT-17' 
group by EVENTDATE, NAME
order by EVENTDATE, NAME;

答案 2 :(得分:0)

示例查询不起作用的原因是您没有按名称删除重复项。要执行此操作,您必须使用select语句中的所有内容使用名称或组来获取不同的值。例如,子查询EVENTDATE,NAME,BARCODE的不同组合以删除重复项 - 然后按eventdate计算条形码。

SELECT dT.EVENTDATE
      ,dT.BARCODE
      ,COUNT(dT.BARCODE) AS TOTAL
  FROM (
         SELECT DISTINCT EVENTDATE, NAME, BARCODE
         FROM TIMESHEET
         --WHERE EVENTDATE = '2017-10-27'  --if you really need to filter by date
                                           --otherwise will group by all dates
       ) AS dT
GROUP BY dT.EVENTDATE  
        ,dT.BARCODE