【问题标题】:SQL Filtering duplicates by different columns in querySQL按查询中的不同列过滤重复项
【发布时间】:2013-03-25 03:14:02
【问题描述】:

在这个线程上,我有一个问题已成功回答。

searching for filtered duplicates in access query

现在我有第二个问题。也许有人可以帮助我。

我有一个如下所示的查询:

  1. 查询 A_Gravur:

    SP1 | SP2     | SP3
    
     64 | CB75000 | 3
     64 | empty   | D
     70 | CB70010 | 1
     70 | CB70010 | 1
    119 | CB70050 | 5
    119 | empty   | D
    165 | S15002  | Schalter
    165 | S15002  | Schalter
    194 | R70034  | Poti
    194 | R10023  | Potentiometer
    196 | S10063  | Schalter
    196 | S10063  | Schalter
    197 | S10063  | Schalter
    198 | S10070  | 3
    199 | CB75000 | 5
    

此查询被另一个查询过滤以检查重复项。 最终结果如下所示:

结果:

SP1 | SP2     | SP3

194 | R70034  | Poti 470k
194 | R10023  | Potentiometer
196 | S10063  | Schalter
197 | S10063  | Schalter
 64 | CB75000 | 3
199 | CB75000 | 5

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 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;

现在是我的新问题:

我在查询 A_Gravur(SP4 和 SP5)中添加了 2 个新列并进行了重复搜索

SP1 | SP2     | SP3           | SP4     | SP5       |

194 | R70034  | Poti 470k     |123546   |88859     
194 | R10023  | Potentiometer |88859    |
196 | S10063  | Schalter      |7773     |
197 | S10063  | Schalter      |99992    |
 64 | CB75000 | 3             |177777   |
199 | CB75000 | 5             |99999    |

说明:在 SP4 中总是有值(Materialnumber)。 现在,当我搜索重复项时,它应该只找到这个结果:

SP1 | SP2     | SP3           | SP4     | SP5       |

196 | S10063  | Schalter      |7773     |
197 | S10063  | Schalter      |99992    |
 64 | CB75000 | 3             |177777   |
199 | CB75000 | 5             |99999    |

因为 SP5 (88859) 中的数字也在 SP4 (88859) 中,而 SP1 在两条记录中的数字相同 (194)

但如果看起来像这样则结果是正确的

SP1 | SP2     | SP3           | SP4     | SP5       |

194 | R70034  | Poti 470k     |123546   |0000001     
194 | R10023  | Potentiometer |88859    |
196 | S10063  | Schalter      |7773     |
197 | S10063  | Schalter      |99992    |
 64 | CB75000 | 3             |177777   |
199 | CB75000 | 5             |99999    |

感谢您的帮助!!

【问题讨论】:

  • 我刚刚看到你的问题,我不明白一件事。您是忽略 SP5 中的值还是必须将其与 SP4 中的值进行比较。
  • 我必须将它与 sp4 进行比较 - 但前提是 sp1 在两行中都相同。当 sp1 有重复项时,Sp5 是我的程序中应该使用的首选材料编号
  • 我还是有点不清楚。 0000001 在你的最后一张桌子上是从哪里来的?
  • 我的列表是SAP系统生成的。 sp4 中的所有值都来自那里。我必须完成 sp5 列。首先,我在 sp1 中搜索重复项。之后,我在 SP2 中搜索重复项。之后,SP3 中所有带有字母 D 的重复项都将被删除。之后,将删除 sp1 和 sp2 中相同的所有重复项。最后,当 sp5 中的值在 sp4 中的任何位置(比较)时,它也应该从最终结果中删除 - 所以忘记值 0000001 它只是一个示例
  • 对不起我的英语只是学校英语:-)

标签: sql vba


【解决方案1】:

这可能会做你想做的事:

SELECT SP1, SP2, SP3, SP4, SP5
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,
    CAST(COALESCE(SP5, SP4) AS CHAR)) NOT IN
  (SELECT CONCAT(CAST(SP1 AS CHAR), SP2,
    CAST(COALESCE(SP5, SP4) AS CHAR))
    FROM A_Gravur
    WHERE SP3 <> 'D'
    GROUP BY CONCAT(CAST(SP1 AS CHAR),SP2,
      CAST(COALESCE(SP5, SP4) AS CHAR))
    HAVING COUNT(*)>1)
AND SP3<>'D'
ORDER BY SP1, SP2, SP3, SP4;

CONCAT() 选择第一个不为空的字段,如果存在则选择 SP5,否则选择 SP4。

这里是SQL Fiddle。如果我没有正确理解,请您在那里修改测试数据并添加带有新 SQL Fiddle 地址的注释,以便我有好的数据可以处理。

【讨论】:

  • 您好,我刚刚测试了结果 - 看起来非常好 - 我明天会在我的工作中测试它,然后我会给你我的最终答案 - 非常感谢直到现在,也许你可以解释一下你的工作方式我也会和你一样好:-)
  • 如果工作正常,请告诉我,我很乐意编辑答案,为您添加其他字段的那一天提供一些解释 ;-) 一个小解释,以备您需要:我假设 SP4 和 SP5 是整数并使用CAST(... AS CHAR)。如果这些字段是字符类型,则不需要强制转换。
  • 您好!我需要一点点将 coalesce 函数转换为 ms 访问,但现在它工作得很好!!非常感谢。现在我可以继续使用我的 vba 代码了。
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2010-11-22
  • 2022-06-10
相关资源
最近更新 更多