使用 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 上。
使用PIVOT
和GROUP 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
我有一个 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 上。
使用PIVOT
和GROUP 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