SQL - 加入 2 个表并计算 运行 总和(月初至今)
SQL - Join 2 tables and calculate running sum (month to date)
有 2 个 table:
需要在同一个 ID 上加入这 2 个 table 的日期 - 以显示从同月开始到(包括)第一个 [=29] 日期的总金额(总和) =].
结果应该是:
我制作了一部分(总计 运行)但还没有完成:
select
date_a, a.id,
sum(b.AMOUNT) over (partition by b.ID, to_varchar(b.ID::date, 'yyyy-mm')
order by b.ID)
as AMOUNT_MONTH_TO_DATE
FROM
a
inner join
b
on
a.id = b.id
除非预期结果第二行的total_amount
是一个错误,否则应该这样做:
SELECT date_a,
a.id,
SUM(IF(date_b <= date_a AND MONTH(date_b)=MONTH(date_a),amount,0)) AS total_amount
FROM a
INNER JOIN b
ON a.id=b.id
GROUP BY date_a, a.id
ORDER BY date_a DESC;
根据您的解释,abc2 也应该 return 0 但您在预期输出中显示了 10。原因是 date_b 大于 date_a,对于 "Start Date of month" 和 "Date_a" 之间的逻辑 date_b,不应为 abc2 选择任何内容。如果我是对的,下面的查询将起作用-
SELECT
A.id,
A.date_a,
COALESCE
(
(
SELECT
SUM(amount)
FROM TABLE_2 B
WHERE B.id = A.id
AND B.date_b BETWEEN DATEADD(DD,-(DAY(date_a)-1),date_a) AND A.date_A
)
,0
)
FROM TABLE_1 A
使用 LEFT JOIN-
可以实现相同的输出
SELECT
A.id,
A.date_a,
COALESCE(SUM(B.amount),0) total_amount
FROM table_1 A
LEFT JOIN table_2 B ON B.id = A.id
AND B.date_b BETWEEN DATEADD(DD,-(DAY(A.date_a)-1),date_a) AND A.date_A
GROUP BY A.id,A.date_a
有 2 个 table:
需要在同一个 ID 上加入这 2 个 table 的日期 - 以显示从同月开始到(包括)第一个 [=29] 日期的总金额(总和) =].
结果应该是:
我制作了一部分(总计 运行)但还没有完成:
select
date_a, a.id,
sum(b.AMOUNT) over (partition by b.ID, to_varchar(b.ID::date, 'yyyy-mm')
order by b.ID)
as AMOUNT_MONTH_TO_DATE
FROM
a
inner join
b
on
a.id = b.id
除非预期结果第二行的total_amount
是一个错误,否则应该这样做:
SELECT date_a,
a.id,
SUM(IF(date_b <= date_a AND MONTH(date_b)=MONTH(date_a),amount,0)) AS total_amount
FROM a
INNER JOIN b
ON a.id=b.id
GROUP BY date_a, a.id
ORDER BY date_a DESC;
根据您的解释,abc2 也应该 return 0 但您在预期输出中显示了 10。原因是 date_b 大于 date_a,对于 "Start Date of month" 和 "Date_a" 之间的逻辑 date_b,不应为 abc2 选择任何内容。如果我是对的,下面的查询将起作用-
SELECT
A.id,
A.date_a,
COALESCE
(
(
SELECT
SUM(amount)
FROM TABLE_2 B
WHERE B.id = A.id
AND B.date_b BETWEEN DATEADD(DD,-(DAY(date_a)-1),date_a) AND A.date_A
)
,0
)
FROM TABLE_1 A
使用 LEFT JOIN-
可以实现相同的输出SELECT
A.id,
A.date_a,
COALESCE(SUM(B.amount),0) total_amount
FROM table_1 A
LEFT JOIN table_2 B ON B.id = A.id
AND B.date_b BETWEEN DATEADD(DD,-(DAY(A.date_a)-1),date_a) AND A.date_A
GROUP BY A.id,A.date_a