【问题标题】:searching for filtered duplicates in access query在访问查询中搜索过滤的重复项
【发布时间】:2013-02-25 13:54:38
【问题描述】:

我在 MSACCESS 2003 中遇到以下问题

我有一个名为 A_Gravur 的查询,它包含 3 列 SP1、SP2、SP3

现在我想搜索重复项。

查询 A_Gravur:

SP1 | SP2 | SP3

64 | CB75000 | 3

64 |空| D

70 | CB70010 | 1

70 | CB70010 | 1

119 | CB70050 | 5

119 |空| D

165 | S15002 |夏尔特

165 | S15002 |夏尔特

194 | R70034 |波蒂

194 | R10023 |电位器

196 | S10063 |夏尔特

196 | S10063 |夏尔特

197 | S10063 |夏尔特

198 | S10070 | 3

199 | CB75000 | 5


首先:从 A_Gravur 过滤 SP1 中的重复项

结果:

SP1 | SP2 | SP3

64 | CB75000 | 3

64 |空| D

70 | CB70010 | 1

70 | CB70010 | 1

119 | CB70050 | 5

119 |空| D

165 | S15002 |夏尔特

165 | S15002 |夏尔特

194 | R70034 |波蒂

194 | R10023 |电位器

196 | S10063 |夏尔特

196 | S10063 |夏尔特


在第一次重复搜索结果太多了!它应该像这样过滤: 过滤器(如果 SP3 中的一个结果是字母 D,则不显示) Filter (IF [SP1 and SP2] = [SP1 and SP2 from next record] then don't show it

第二:从 A_Gravur 过滤 SP2 中的重复项

SP1 | SP2 | SP3

64 | CB75000 | 3

199 | CB75000 | 5

196 | S10063 |夏尔特

196 | S10063 |夏尔特

197 | S10063 |夏尔特


我的最终结果应该是这样的 它是带有过滤器的 SP1 重复搜索 + SP2 重复搜索的结果


SP1 | SP2 | SP3

194 | R70034 |波蒂 470k

194 | R10023 |电位器

196 | S10063 |夏尔特

197 | S10063 |夏尔特

64 | CB75000 | 3

199 | CB75000 | 5


知道如何解决我的问题吗? 函数还是 sql 查询?

【问题讨论】:

  • 我正在尝试解决您的问题,但是您的测试数据存在一些问题。如果我理解正确,最终输出中应该有两行以 70 开头,并且不应该出现以 199 开头的行。如果两行相同,比如以 196 开头的行,你想要输出两行还是一份可以?
  • 您好,非常感谢您的帮助。 64 和 199 在 sp2 列中相同,应该出现,因为它们在 sp1 中不同。还有两条线 194,因为它们在 sp2 中不同。它也应该出现在 196 和 197 的两行之一,因为它们在 sp1 中是不同的。抱歉,我在最终输出中犯了一个错误。我会改正的
  • 我需要输出两行,因为最终用户必须搜索错误
  • 你说应该出现 64,但是第二行 64 在 SP3 中有 D...好吧,我明白了,你测试字段 SP1 或 SP2 重复...它变得更复杂:- (
  • hmm 抱歉,我用平板电脑写了这篇文章,如果 SP3 中有 D,那么 SP2 中什么都没有。因此,如果对 SP2 进行重复检查,则应该只有 2 个结果

标签: sql vba ms-access-2003


【解决方案1】:

我认为这个 SQL 查询会给你你想要的:

SELECT SP1, SP2, SP3
  FROM A_Gravur
  WHERE (SP1 IN
    (SELECT SP1
      FROM A_Gravur
      WHERE SP3<>'D'
      GROUP BY SP1
      HAVING COUNT(*)>1)
  OR SP2 IN
    (SELECT SP2
      FROM A_Gravur
      WHERE SP3<>'D'
      GROUP BY SP2
      HAVING COUNT(*)>1))
  AND SP3<>'D'
  ORDER BY SP1, SP2;

` 你可以在http://sqlfiddle.com/#!2/7351d/16玩这个

为了消除完全重复的行,它变得更加复杂:

SELECT SP1, SP2, SP3
  FROM A_Gravur
  WHERE (SP1 IN
    (SELECT SP1
      FROM A_Gravur
      WHERE SP3<>'D'
      GROUP BY SP1
      HAVING COUNT(*)>1)
  OR SP2 IN
    (SELECT SP2
      FROM A_Gravur
      WHERE SP3<>'D'
      GROUP BY SP2
      HAVING COUNT(*)>1))
  AND CONCAT(CAST(SP1 AS CHAR),SP2,SP3) NOT IN
    (SELECT CONCAT(CAST(SP1 AS CHAR),SP2,SP3)
      FROM A_Gravur
      WHERE SP3 <> 'D'
      GROUP BY CONCAT(CAST(SP1 AS CHAR),SP2,SP3)
      HAVING COUNT(*)>1)
  AND SP3<>'D'
  ORDER BY SP1, SP2;

这可以在http://sqlfiddle.com/#!2/7351d/35找到

请注意,CONCAT(CAST(SP1 AS CHAR),SP2,SP3) 是 SQL Fiddle 的 MySQL 语法。

在 MS Access 中,可以使用 Format(SP1) &amp; SP2 &amp; SP3

【讨论】:

  • 非常感谢,这是一个非常好的结果。是否可以删除那些类似的行?我的意思是 70 和 165 中的两个数字在 SP1 和 SP2 中相同的数字?
猜你喜欢
  • 2020-10-29
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2015-01-25
相关资源
最近更新 更多