我有三个表ClaimHeader,ResClaim和ResActivity。 ClaimHeader表的主键在ResClaim表中用作外键,ResClaim表的主键在ResActivity表中用作外键。
以下是我的表格
ClaimHeader:
HeaderID FileID FileName
1 fileid1 file1.xml
2 fileid2 file2.xml
3 fileid3 file3.xml
4 fileid4 file4.xml
--------------------------------------------------
ResClaim:
ClaimPKID HeaderPKID ClaimDateSettlement
1 1 2017-04-08
2 1 2017-03-08
3 2 2017-04-10
4 3 2017-05-08
--------------------------------------------------
ResActivity:
ActivityPKID ClaimPKID ActivityNet
1 1 400
2 2 3000
3 2 2030
4 3 5000
ResClaim表使用HeaderPKID作为来自ClaimHeader表的外键,ResActivity表使用ClaimPKID作为ResClaim表中的外键
我的场景是我应该显示所有三个表中的相关记录。
例如,我想显示来自ClaimHeader表的FileID,来自ResClaim表的Total索赔计数和ResActivity表中具有匹配条件的ActivityNet的Sum。
我的预期结果是:
FileID | Total Claim(s) | ActivityNet
--------------------------------------------------
fileid2 | 1 | 5030 (3000+2030)
--------------------------------------------------
我试过下面的查询:
SELECT
`ClaimHeader`.*,
count(ResClaim.ClaimPKID) as claims,
sum(ResActivity.ActivityNet) as net
FROM
`ClaimHeader`
RIGHT OUTER JOIN `ResClaim`
ON ResClaim.ClaimPKID = ClaimHeader.HeaderID
RIGHT OUTER JOIN `ResActivity`
ON ResClaim.ClaimPKID = ResActivity.ActivityPKID
上面的查询没有返回相关的记录值 - 而是返回所有列的总和并从ResActivity和ResClaim表中计数。
你问的问题仍然不完全清楚。您似乎要么每个声明标题需要一个结果行,要么每个文件需要一个结果行。因此,按相关列分组。
通过加入所有记录,您获得的索赔标题和索赔当然是多方面的,例如:同
你从连接得到这个中间结果:
header | claim | action -------+---------+---------- head1 | claim10 | action100 head1 | claim10 | action101 head1 | claim11 | action110 head1 | claim11 | action111 head2 | claim20 | action200 ...
现在,通过按标题分组,您将获得head1的一个聚合结果行,head2的一个聚合结果行。由于中间结果包含每个操作一个记录,因此您可以轻松地对它们求和。但至于声称:head1有四个记录,如果你做count(*)
或count(claimpkid)
你会得到4的结果(count(claimpkid)
计算所有非空的claimpkid
,在这个例子中总是如此)。你想要做的是计算不同的主张(在这里是两个:权利要求10和权利要求11)。所以使用COUNT DISTINCT
。
select
h.headerid,
count(distinct c.claimpkid) as claims,
coalesce(sum(a.activitynet), 0) as net
from claimheader h
left outer join resclaim c on c.claimpkid = h.headerid
left outer join resactivity a on a.activitypkid = c.claimpkid
group by h.headerid
order by h.headerid;
我使用左外连接(和COALESCE
)的情况是标题没有声明或声明没有动作,为此我们将显示零而不是从结果中删除它们。
如上所述,如果你想要每个文件,那么选择fileid
并按它而不是headerid
分组。