使用 SUM 检索 2 个表中的记录并获取最新记录

Retrieving records across 2 tables with a SUM and getting lastest record

我有一个 table 名称“声明”和“条目”。声明 table 是父项,条目是子项。我正在尝试获取声明 table 中的最新条目。这是我的数据简化后的样子:

Claims Table
rID     code     dateOn
1        A      2/12/2020
2        B      1/23/2020
3        A      7/11/2020
4        A      8/20/2020

Entries Table
eID     rID    type     amount
1        1     cat        5
2        3     cat        5
3        4     dog        5
4        1     dog        5
5        1     cat        2

Desired Result
code   latestCatDate    latestDogDate    DogTotal    CatTotal
A         7/11/2020        8/20/2020        10          12

这是我的 SQL 在没有日期的情况下的样子...这很好用:

SELECT 
code, 
SUM(case when entries.type='cat' then entries.amount else 0.0 end),
SUM(case when entries.type='dog' then entries.amount else 0.0 end),

FROM claims c INNER JOIN entries ON entries.rID=c.rID

WHERE c.code='A'

GROUP BY code

我被困在如何获取 latestDogDate 和 latestCatDate 上。

使用PIVOTGROUP BY

with
Claims as (
    select * from (values
    (1, 'A', '2/12/2020'),
    (2, 'B', '1/23/2020'),
    (3, 'A', '7/11/2020'),
    (4, 'A', '8/20/2020')
    ) x (rID     ,code     ,dateOn)
),
Entries as (
    select * from (values
    (1,        1,     'cat',        5),
    (2,        3,     'cat',        5),
    (3,        4,     'dog',        5),
    (4,        1,     'dog',        5),
    (5,        1,     'cat',        2)
    ) x (eID     ,rID    ,type     ,amount)
),
j as (
    select c.*, e.type t2, e.eid, type, amount
    from Claims c
    join Entries e on c.rID = e.rID
),
p1 as (
    select p.code, t2, max(p.dateon) d, sum(cat) tot_cat, sum(dog) tot_dog
    from j
    pivot ( sum(amount) for type in ([cat],[dog])) p
    group by p.code, t2
),
p2 as (
    select *
    from p1
    pivot (max(d) for t2 in ([cat],[dog])) p
)
select max(code) code, max(tot_cat) tot_cat, max(tot_dog) tot_dog, max(cat) latestCatDate, max(dog) latestDogDate 
from p2

您可以简单地向查询中添加更多条件聚合表达式,如下所示:

SELECT 
    c.code, 
    MAX(CASE WHEN e.type = 'cat' THEN dateOn end) latestCatDate,
    MAX(CASE WHEN e.type = 'dog' THEN dateOn end) latestDogDate,
    SUM(CASE WHEN e.type = 'cat' THEN e.amount else 0.0 end) catTotal,
    SUM(CASE WHEN e.type = 'dog' THEN e.amount else 0.0 end) dogTotal
FROM claims c 
INNER JOIN entries e ON e.rID = c.rID
WHERE c.code = 'A'
GROUP BY code