![](/img/trans.png)
[英]How to JOIN two tables based on a WHERE that uses a complex statement in SQL
[英]How to create SQL based on complex rule?
假設我已正確理解,我將建議一個相關的子查詢,例如:
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
以適合您的數據)
在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
只是將值放在結果集的適當行上。 如果月份中的所有行都具有相同的值,則代碼將更簡單。
這是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
如果您的版本支持窗口功能(例如,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
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.