如何基于复杂规则创建SQL?

时间:2018-11-28 22:31:00

标签: mysql sql mysql-logic

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

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

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

然后在下个月(十月)进行查找-它会找到第一个出现的id = 1,并将3存储在计算列中;对于第二个出现的id = 1,则在10月它将对同一个id从该月的月初开始求和(3 + 2 = 5)

enter image description here

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

在Oracle和MySQL 8+中,可以使用窗口函数。相应的日期算法有所不同,但这是个主意:

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只是将值放在结果集的适当行上。如果月份中的所有行都具有相同的值,则代码将更简单。

答案 2 :(得分:1)

这是oracle的解决方案。由于您没有给表命名,因此我将其命名为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

答案 3 :(得分:1)

如果您的版本支持窗口功能(例如,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
;