簡體   English   中英

如何基於復雜規則創建SQL?

[英]How to create SQL based on complex rule?

我有3列(id,日期,金額),並嘗試計算第4列(calculated_column)。

如何創建SQL查詢,請執行以下操作:

需要計算的方法是查看ID(例如1),並查看該月的所有相同ID(例如,第一次出現-9月1日應該計算為5,第二次出現-5 +6 = 11->從該月初開始的所有金額(包括該金額)。

然后在下個月(Oct)-它會找到id = 1的第一個匹配項並將3存儲在calculated_column中,而id = 1的第二個出現在10月,它將從該月的月初開始計算相同的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

(更改表名稱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM