使用查找重复查询来查找多个字段之间的重复数据

时间:2016-03-17 12:39:49

标签: sql ms-access

如果这是一个非常基本的问题我很抱歉,但我对使用Access和数据库管理和设计非常陌生。

我正在进行一项调查,要求现场调查员完成作业。这些分配由员工ID,站点位置,日期和6小时时间块组成。对于任何给定的分配,可以有1个站点位置或2个(员工将分配两个站点之间的时间间隔)。我有兴趣运行查找重复查询,以查找一个月内不止一次访问网站的所有日子。

我的数据集看起来像这样:

SiteID1   SiteID2   Date   StartTime  EndTime EmployeeID
1646      1646      03/11  11:00      17:00   0000
1646      1646      03/03  11:00      17:00   0002
4242      1646      03/19  11:00      17:00   0001
1646      4242      03/11  08:00      14:00   0000

我使用查询向导运行查询,以查找SiteID1SiteID2字段中的重复项。它只返回1,2和4记录。我希望它也能返回第3条记录。如何更改我的查询,以便在SiteID1SiteID2字段中查找重复项,而不是专门处理它们?我实际上甚至不确定为什么它没有返回此记录,因为它仍然在SiteID2字段中共享重复数据。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这可以帮助您安排列值以获得所需的摘要:

SELECT
      IIF( SiteID1 >  SiteID2 , SiteID2, Siteid1)
    , IIF( SiteID1 >= SiteID2 , SiteID1, Siteid2)
    , Date
    , COUNT(*)
FROM Sheet1
GROUP BY
      IIF( SiteID1 >  SiteID2 , SiteID2, Siteid1)
    , IIF( SiteID1 >= SiteID2 , SiteID1, Siteid2)
    , Date
;

IIF()调用需要交换的值(例如1646/4242和4242/1646被视为相等。

然后,您可以使用HAVING子句仅查找计数大于1或2的行,例如

SELECT
      IIF( SiteID1 >  SiteID2 , SiteID2, Siteid1)
    , IIF( SiteID1 >= SiteID2 , SiteID1, Siteid2)
    , Date
FROM Sheet1
GROUP BY
      IIF( SiteID1 >  SiteID2 , SiteID2, Siteid1)
    , IIF( SiteID1 >= SiteID2 , SiteID1, Siteid2)
    , Date
HAVING COUNT(*) > 2
;

注意,在使用having子句时,您不必将COUNT(*)包含为可见列,但是您可以同时执行这两项操作,这是很常见的事情。

由于您不熟悉SQL,因此值得注意的是,许多其他SQL投诉数据库不支持IIF(),而是使用案例表达式。同样在许多其他数据库中,单词date可能是一个保留字,因此您需要小心使用它,如下所示:

SELECT
      case when SiteID1 >  SiteID2 then SiteID2 else Siteid1 end
    , case when SiteID1 >= SiteID2 then SiteID1 else Siteid2 end
    , "Date"
FROM Sheet1
GROUP BY
      case when SiteID1 >  SiteID2 then SiteID2 else Siteid1 end
    , case when SiteID1 >= SiteID2 then SiteID1 else Siteid2 end
    , "Date"
HAVING COUNT(*) > 2
;

我建议你不要使用date这个词作为列名,让它更有意义,例如AssignmentDate