SQL-联接2个表并计算运行总和(月至今)
共有两个表:SQL-联接2个表并计算运行总和(月至今),sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,共有两个表: 需要在同一ID上连接这两个表并指定一个日期-以显示从同一个月开始到第一个表的日期(包括)的总金额(总和) 结果应该是: 我只做了一部分(运行总数),但还不是全部: 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_MO
需要在同一ID上连接这两个表并指定一个日期-以显示从同一个月开始到第一个表的日期(包括)的总金额(总和) 结果应该是:
我只做了一部分(运行总数),但还不是全部:
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
除非预期结果第二行中的
总金额
是错误的,否则应该这样做:
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;
选择日期a,
a、 身份证,
SUM(如果(date_b)根据您的解释,abc2也应该返回0,但您在预期输出中显示了10。原因是date_b大于date_a,对于“月的开始日期”和“date_a”之间的逻辑日期_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
使用左连接可以实现相同的输出-
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
我可以知道计算是如何进行的吗?如果我参考你的预期结果,它似乎没有意义。计算只是我自己如何计算的一个“注释”。id=abc1的日期是4-10(25)+id=abc1的日期是4-20(30)+id=abc1的日期是4-30(20)因此,对于这个日期和相同的id,总数是20+30+25。对于4-30的日期,需要从第四个月初的第二个表中获取相同id的所有金额。abc2是否应返回10?如表2中所示,abc2的日期大于表1中的日期。我还想知道相同的事情,我认为ISNULL
假设为IFNULL
?和“字段列表”中的未知列“A.RN”
谢谢@tcadidot0.RN基本上来自我的测试脚本。但我觉得ISNULL是可以的。不是吗?它是一个有效的MySQL操作符,但我看到您正试图进行一个操作,当子查询为NULL
时,返回“0”。据我所知,ISNULL(表达式)
而IFNULL(expression,alt\u value)
。顺便说一句,我在检查与您的MySQL服务器版本相对应的手册,以了解在“-(DAY(date\u a)-1”附近使用的正确语法。
欢迎@Joe使用。如果有效,您可以接受ans:)正在尝试。请您解释一下这部分:B.date\B介于DATEADD(DD,-(DAY(date\u a)-1)、date\u a)和a.date\u a之间的时间。