【发布时间】:2020-12-09 04:26:20
【问题描述】:
有 5 个表正在被查询。
- Assignments(将客户分配给审计员的表格)
- AssignmentCarriers(运营商列表及其设置。链接到分配)
- 审核员(人)
- 客户
- 索赔(由审计员代表客户提出的索赔)
- 条目(每个声明可以有多个条目。这是我们从中获取 $$ 的地方)
这是场景。管理层可以指派一个客户给一个审计员。该审计员可以为他的客户提出索赔以尝试赚取 $$。
我必须找出审计员被分配了哪些客户,以及他在特定时间段之间提出了哪些索赔,以及总共退回了多少美元。这是我的代码。我将它粘贴两次,以便您可以看到它看起来像未评论和评论。然后我将展示我目前的结果,希望有人可以帮助我,因为我似乎无法弄清楚这里到底发生了什么。
代码中断
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