如何根据复杂规则创建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
;
我有 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
;