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之间的时间。