如何根据复杂规则创建SQL?

How to create SQL based on complex rule?

我有 3 列(id、日期、金额)并试图计算第 4 列(calculated_column)。

如何创建 SQL 查询以执行以下操作:

需要计算的方法是查看 ID(例如 1)并查看该月所有相同的 ID(例如,第一次出现 - 9 月 1 日应计算为 5,第二次出现 - 它将是 5+6=11 -> 从该月开始的所有金额,包括该金额)。

然后在下个月(10 月)- 它将找到第一次出现的 id=1 并将 3 存储在 calculated_column 中,对于 10 月第二次出现的 id=1,它将从相同 ID 的那个月 (3+2=5)

假设我理解正确,我会建议一个相关的子查询,例如:

select t.*, 
(
    select sum(u.amount) from table1 u  
    where 
        u.id = t.id and
        date_format(u.date, '%Y-%m') = date_format(t.date, '%Y-%m') and u.date <= t.date
) as calculated_column
from table1 t

(更改 table 名称 table1 以适合您的数据)

在 Oracle 和 MySQL 8+ 中,您可以使用 window 函数。相应的日期算法各不相同,但思路是这样的:

select t.*,
       (case when date = max(date) over (partition by to_char(date, 'YYYY-MM') and
                  id = 1
             then sum(amount) over (partition by to_char(date, 'YYYY-MM')
        end) as calculated_column
from t;

外层的case只是简单的把值放在结果集合适的行上。如果月份中的所有行都具有相同的值,代码会更简单。

这是oracle的解决方案。因为你没有给table名字我给它取了my_table,改成真名

select
    t1.id, 
    t1.date,
    t1.amount,
    decode(t1.id, 1, sum(nvl(t2.amount, 0)), null) calculated_column
from my_table1 t1
left join my_table t2 
    on trunc(t2.date, 'month') = trunc(t1.date, 'month')
    and t1.id = 1
group by t1.id, t1.date, t1.amount

如果您的版本支持 window 功能(例如 MySQL 8 以上)

# MySQL 8+
select 
       t.*
     , sum(amount) over (partition by id, date_format(date, '%Y-%m-01') order by date) as calculated_column
from t
;

-- Oracle
select 
       t.*
     , sum(amount) over (partition by id, trunc(date, 'MM') order by date) as calculated_column
from t
;