【问题标题】:SUM and JOIN across multiple tables to work properly. Wrong results returnedSUM 和 JOIN 跨多个表正常工作。返回错误的结果
【发布时间】:2020-12-09 04:26:20
【问题描述】:

有 5 个表正在被查询。

  1. Assignments(将客户分配给审计员的表格)
  2. AssignmentCarriers(运营商列表及其设置。链接到分配)
  3. 审核员(人)
  4. 客户
  5. 索赔(由审计员代表客户提出的索赔)
  6. 条目(每个声明可以有多个条目。这是我们从中获取 $$ 的地方)

这是场景。管理层可以指派一个客户给一个审计员。该审计员可以为他的客户提出索赔以尝试赚取 $$。

我必须找出审计员被分配了哪些客户,以及他在特定时间段之间提出了哪些索赔,以及总共退回了多少美元。这是我的代码。我将它粘贴两次,以便您可以看到它看起来像未评论和评论。然后我将展示我目前的结果,希望有人可以帮助我,因为我似乎无法弄清楚这里到底发生了什么。

代码中断

SELECT DISTINCT 
  a.clientID, 
  code,
  SUM(case when cl.dateon >='1/1/2020' AND cl.dateon < '1/3/2020' AND entries.errorCode NOT IN('DP','RB','DN','WP','WA','CE','RC','SI','CI','PE','OV') AND status='closed' AND cl.client=code then entries.refundDue else 0.0 end) as JanRC20,   
  SUM(case when cl.dateon >='1/1/2020' AND cl.dateon < '1/3/2020' AND entries.errorCode IN('DP','RB','DN','WP','WA','CE','RC','SI','CI','PE','OV') AND status='closed' AND cl.client=code then entries.refundDue else 0.0 end) as JanPC20

FROM assignments a 

INNER JOIN clients c ON c.clientID=a.clientID 
INNER JOIN AssignmentCarriers ac ON ac.acID=a.acID 
INNER JOIN claims cl ON cl.auditorID=a.auditorID
INNER JOIN entries ON entries.rID=cl.rID


WHERE a.auditorID=101 AND isAssignment='True' AND active='True' AND pos=1

GROUP BY a.clientID, code

ORDER BY code

注释代码

SELECT DISTINCT
  a.clientID, 
  code,-- being an older database, the uniqueID here is the code, not clientID
  SUM(case when cl.dateon >='1/1/2020' AND cl.dateon < '1/3/2020' AND entries.errorCode NOT IN('DP','RB','DN','WP','WA','CE','RC','SI','CI','PE','OV') AND status='closed' AND cl.client=code then entries.refundDue else 0.0 end) as JanRC20, -- this is supposed to SUM up the "refundDue" for the specified time period for claims that have a status of closed and does not have a specific errorCode.
  SUM(case when cl.dateon >='1/1/2020' AND cl.dateon < '1/3/2020' AND entries.errorCode IN('DP','RB','DN','WP','WA','CE','RC','SI','CI','PE','OV') AND status='closed' AND cl.client=code then entries.refundDue else 0.0 end) as JanPC20 -- same as the previous but this includes the specified errorCodes

FROM assignments a 

INNER JOIN clients c ON c.clientID=a.clientID -- this brings in the code from the clients table and whether it's active or not (bool)
INNER JOIN AssignmentCarriers ac ON ac.acID=a.acID -- for checking if isAssignments='True'
INNER JOIN claims cl ON cl.auditorID=a.auditorID -- brings in claims table
INNER JOIN entries ON entries.rID=cl.rID -- brings in entries table


WHERE a.auditorID=101 AND isAssignment='True' AND active='True' AND pos=1 -- only return results where a specified auditor (101) is assigned

GROUP BY a.clientID, code

ORDER BY code

我希望这是有道理的。我觉得我很接近,但它不起作用。当我运行代码时,我确实得到了所有这些审计员分配给客户的列表。这工作正常。剩下的是 $$ 金额。因此,关注分配给该审计员的 1 个客户,结果如下:

clientID.  code.   JanRC20.   JanPC20. 
678        INCM   8007.2382    0.0000

当我使用 WHERE auditID=101 直接在索赔/条目表上运行查询,然后针对指定的日期和代码运行查询时,JanPC20 = 0 但 JanRC20 = 2669.0794 确实如此。

实际上只返回了 1 条记录,“2669.0794”是refundDue 列中的金额。这里发生了什么?我期待着我能得到的任何帮助。谢谢!

【问题讨论】:

  • 这里最好的办法是尝试在没有 SUM 和 GROUP BY 行的情况下运行代码。注释掉 GROUP BY 行,取出“SUM(...)”,留在 CASE 选择中。然后你应该能够看到所有将被求和的行。从那里你应该能够缩小为什么它总结了这么多行。您的联接导致您期望的数量增加三倍 (8007=2669*3),因此您的联接之一返回 3 行。
  • 8007.2382 y 正好是 2669.0794 的 3 倍,一定有一个连接缺少某些条件,这是您期望被计算 3 次的唯一一条记录。
  • @MundoPeter 无论是这样,还是像 cmets 中提到的那样,ClientId 都不是唯一的。如果是这样,您可以尝试删除 ClientId 并仅按代码分组。那么 distinct 应该可以正常工作。
  • k... 我想我知道是什么导致了问题。在分配表中,他被多次分配给同一个客户……是吗?因为每个客户都附有运营商。在这种情况下,一个客户可以拥有 100 个运营商,审核员负责 1 个客户的 3 个运营商。它仍然是我们想要的 1 个客户,因为索赔是根据客户而不是承运人提出的。 ????
  • 我正在尝试以不同的方式解决此问题,但不确定是否有办法仅在 SQL 中执行此操作。有没有办法通过 2 个步骤获得所需的结果(上表)。因此,第一步将获取分配给审计员的所有客户。一旦我有了这些客户 ID,然后继续查询索赔表。我已经知道如何自己获取clientID,但是如何组合2。基本上根据第一个结果生成第二个查询......我想。这可能吗?

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

运行以下命令,看看三倍是什么:

SELECT DISTINCT 
  a.clientID, 
  code,
  case when cl.dateon >='1/1/2020' AND cl.dateon < '1/3/2020' AND entries.errorCode NOT IN('DP','RB','DN','WP','WA','CE','RC','SI','CI','PE','OV') AND status='closed' AND cl.client=code then entries.refundDue else 0.0 end as JanRC20,   
  case when cl.dateon >='1/1/2020' AND cl.dateon < '1/3/2020' AND entries.errorCode IN('DP','RB','DN','WP','WA','CE','RC','SI','CI','PE','OV') AND status='closed' AND cl.client=code then entries.refundDue else 0.0 end as JanPC20

, a.assignmentID
, c.clientID
, ac.acID
, cl.claimID
, a.auditorID
, entries.rID

FROM assignments a 

INNER JOIN clients c ON c.clientID=a.clientID 
INNER JOIN AssignmentCarriers ac ON ac.acID=a.acID 
INNER JOIN claims cl ON cl.auditorID=a.auditorID
INNER JOIN entries ON entries.rID=cl.rID


WHERE a.auditorID=101 AND isAssignment='True' AND active='True' AND pos=1

--GROUP BY a.clientID, code

ORDER BY code

这将返回 3 行。为所有 3 行返回相同 ID 的 ID 列不是问题。具有不同值的 ID 列是问题所在。这些 ID 来自的表是具有多个值的表。您可能需要对该表进行进一步合并以获得所需的值。

【讨论】:

  • k... 我想我知道是什么导致了这个问题。在分配表中,他被多次分配给同一个客户……是吗?因为每个客户都附有运营商。在这种情况下,一个客户可以有 100 个承运人,审计员负责这 1 个客户的 3 个承运人。它仍然是我们想要的 1 个客户,因为索赔是根据客户而不是承运人开立的。 ?
  • 我正在尝试以不同的方式解决此问题,但不确定是否有办法仅在 SQL 中执行此操作。有没有办法通过 2 个步骤获得所需的结果(上表)。因此,第一步将获取分配给审计员的所有客户。一旦我有了这些客户 ID,然后继续查询索赔表。我已经知道如何自己获取clientID,但是如何组合2。基本上根据第一个结果生成第二个查询......我想。这可能吗?
  • 那么您就不能从您的第一个查询中删除 AssignmentCarriers 吗?由于它不用于返回任何内容,也不用于进一步加入,因此只需删除此加入:INNER JOIN AssignmentCarriers ac ON ac.acID=a.acID
  • AssignmentCarriers 引入了 Where 子句的“isAssignment”部分。此外,即使我删除了它,Assignments 表中的每个 AssignmentCarrier 都有 3 条记录,因此它会产生相同的结果
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2013-01-06
相关资源
最近更新 更多