在SQL中获取重复计数时遇到问题

在SQL中获取重复计数时遇到问题,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我正试图找到一种方法,在SQL中执行一些重复的电子邮件/帐号计数。此数据中的Act_no和Act_电子邮件没有链接(意味着1 Act_no不一定有相同的电子邮件) 我需要对这些信息执行以下操作: 我需要为每个销售人员的整个表格统计重复的Act_电子邮件或Act_编号 -所以Max会为他的所有记录显示3(由于doe@xx.com在表中为max和cat@xx.com多次出现在桌子上(即使cat@xx.com在中(仅在max中一次)。 -乔会数到他的两张唱片,因为mom@xx.com(P_键4和8)和

我正试图找到一种方法,在SQL中执行一些重复的电子邮件/帐号计数。此数据中的Act_no和Act_电子邮件没有链接(意味着1 Act_no不一定有相同的电子邮件)

我需要对这些信息执行以下操作:

我需要为每个销售人员的整个表格统计重复的Act_电子邮件或Act_编号 -所以Max会为他的所有记录显示3(由于doe@xx.com在表中为max和cat@xx.com多次出现在桌子上(即使cat@xx.com在中(仅在max中一次)。 -乔会数到他的两张唱片,因为mom@xx.com(P_键4和8)和Act_No 2(P_键2、3、4和7)都多次出现在表中,但x_x@xx.com第四幕只出现一次

下一部分我也遇到了麻烦,老实说,我不知道该去哪里。我需要做的是只计算最近的Act_no或Act_电子邮件中每个重复的Act_no或Act_电子邮件中最后一个查询的结果(我也需要计算)(抱歉,如果这让人困惑)

现在我知道了doe@xx.com在桌子上不止一次,我需要数一数doe@xx.com仅针对最近的通话(请按1键)对于Max.Sue将有1个最近分配的副本,因为mam@xx.comp_key=8是后来的调用,但是cat@xx.com比p_key=8晚。Joe会有两个最近的,因为Act_no=2比p_key=4,3,2晚,和mom@xx.com晚于p_key=4

所以本质上我要找的是类似于下面的东西

 Salesman | Count of Dupes | Most recent Dupe Assigned
   Max    |       3        |           1
   Sue    |       2        |           1
   Joe    |       2        |           2
这是我到目前为止在第一部分所做的工作,但它并没有达到我想要的,这只是将计数限制在每个销售人员,而不是为每个销售人员计算整个表的重复数:

SELECT Salesman, COUNT(*)
FROM Table t
GROUP BY Salesman
HAVING COUNT(Act_No) > 1 OR  COUNT(Act_Email) > 1;
我们正在处理多个客户和每个客户的电子邮件,我们希望将每个销售人员的佣金支付合并为只包含不同的行为和电子邮件。因此,如果一个帐户或电子邮件与两个销售人员交谈,我们希望记录只计入他们最近交谈的销售人员

简言之,我希望为每个销售人员展示,每个销售人员有多少重复的行为和/或电子邮件,然后展示每个销售人员在分配最新记录时会有多少记录


非常感谢您的帮助!

此查询是否回答了您的第一个问题?请告诉我,基于此,我可以帮助您回答第二个问题

WITH
  EmailCounts AS (
    SELECT Act_Email
    FROM [Table]
    GROUP BY Act_Email
    HAVING COUNT(*) > 1
  ),
  ActCounts AS (
    SELECT Act_No
    FROM [Table]
    GROUP BY Act_No
    HAVING COUNT(*) > 1
  )
SELECT
  Salesman,
  COUNT(COALESCE(EmailCounts.Act_Email, CAST(ActCounts.Act_No AS VARCHAR))) AS Dups
FROM [Table]
LEFT JOIN EmailCounts ON [Table].Act_Email = EmailCounts.Act_Email
LEFT JOIN ActCounts ON [Table].Act_No = ActCounts.Act_No
GROUP BY Salesman
(注意:示例查询将表命名为“
table
”,这是一个保留字,因此必须用方括号分隔。)

此查询从两个“公共表表达式”(CTE)开始—这是EmailCounts为…的
部分—以获取重复电子邮件列表和重复帐号列表

根据您的样本数据,电子邮件的CTE结果为:

Act_Email
----------
cat@xx.com
doe@xx.com
mom@xx.com
账号的CTE结果仅为账户2:

主查询通过sales rep连接到两个列表,并统计存在非空电子邮件或帐号的所有行。其中间结果在
计数之前,如下所示:

Salesman Act_Email  Act_No
-------- ---------- ------
Max      doe@xx.com NULL    <- counted (email not null)
Max      doe@xx.com 2       <- counted (both not null)
Max      cat@xx.com 2       <- counted (both not null)
Sue      mom@xx.com 2       <- counted (both not null)
Sue      cat@xx.com NULL    <- counted (email not null)
Joe      NULL       NULL    <- not counted (both null)
Joe      mom@xx.com NULL    <- counted (email not null)
Joe      NULL       2       <- counted (act_no not null)
将返回在其参数中找到的第一个非null值,如果所有参数都为null,则返回null。如果返回null,
计数
将不计算该行


还要注意,
COALESCE
对我来说不起作用,直到我为账号添加了
CAST
,使其与电子邮件的数据类型相同。

是的,这让我很困惑。简单来说,你的最终目标是什么mom@xx.com或者第五幕存在不止一次,我在你的表中看不到。那正确吗ct还是一个错误?对不起,那是一个打字错误…应该是x_x@xx.com第四幕…我已经纠正了…我还在底部添加了一个解释,这确实有帮助!但是为什么乔会成为2号人物是因为mom@xx.com重复,但第2幕也重复(P_键2、3、4和7)。谢谢你的澄清,也很抱歉错过了关于账号的要点-这显然是在你最初的问题中。我已经更新了查询。谢谢!这很有意义…效果很好!如果我将日期时间添加到CTE中,那么我可以将其用于我问题的第二部分吗?
Act_No
------
2
Salesman Act_Email  Act_No
-------- ---------- ------
Max      doe@xx.com NULL    <- counted (email not null)
Max      doe@xx.com 2       <- counted (both not null)
Max      cat@xx.com 2       <- counted (both not null)
Sue      mom@xx.com 2       <- counted (both not null)
Sue      cat@xx.com NULL    <- counted (email not null)
Joe      NULL       NULL    <- not counted (both null)
Joe      mom@xx.com NULL    <- counted (email not null)
Joe      NULL       2       <- counted (act_no not null)
Salesman Dups
-------- ----
Joe      2
Max      3
Sue      2