簡體   English   中英

為訂閱生成每月付款表

[英]Generating monthly payments table for subscription

我在數據庫中有以下兩個表:

訂閱:每個帳號可以有多個訂閱(A、B、C),每個訂閱都有自己的開始/結束日期和年費。

帳號 訂閱 開始日期 結束日期 年費
123 一個 2022 年 1 月 1 日 2022 年 6 月 5 日 600
123 2022 年 1 月 1 日 2022 年 7 月 5 日 280
123 C 2022 年 4 月 2 日 2022 年 8 月 18 日 450
123 一個 2022 年 7 月 5 日 2022 年 8 月 18 日 650
123 2022 年 8 月 5 日 2022 年 8 月 18 日 330

日歷:包括從 1 月 1 日到 8 月 1 日一年中的所有日子。

日期 年周 月開始 月末
2022 年 1 月 1 日 1 2022 年 1 月 1 日 2022 年 1 月 31 日
2022 年 2 月 1 日 1 2022 年 1 月 1 日 2022 年 1 月 31 日
... ... ... ...
2022 年 7 月 31 日 31 2022 年 1 月 7 日 2022 年 7 月 31 日
2022 年 1 月 8 日 32 2022 年 1 月 8 日 2022 年 8 月 31 日

monthly_payments(預期輸出):訂閱按月計費到每個帳戶。 我試圖實現的目標是建立一個輸出,顯示從 1 月 1 日到 7 月 31 日的預期每月付款和年初至今的付款。 我設法在 python/pandas 中使用一些手動編程邏輯來做到這一點,但我想知道是否有辦法在 sql 本身中產生這個輸出? 如果可能的話,這將是非常有效的。 我不太關心使用哪個 SQL RDMBS(可以是 postgres、mysql 或 sqlite)。

帳號 月開始 月末 NumDaysinMonth 已付費用 年初至今付費
123 2022 年 1 月 1 日 2022 年 1 月 31 日 31 74.74 (訂閱 A 和 B 的費用總計 880/年。880/365 * 31 = 74.74 美元,需要在 1 月份支付) 74.74
123 2022 年 1 月 2 日 28/2/2022 28 98.33 (和上個月一樣,訂閱 A 和 B 需要支付 880/365 * 28 = 67.51。但現在還有訂閱 C,從 2022 年 4 月 2 日開始,費用為 450/365 * 25 =本月 30.82。因此 2 月的總預期付款為 67.51+30.82=98.33 173.07 (98.33+74.74)
... ... ... ... ... ...
123 2022 年 1 月 7 日 2022 年 7 月 31 日 31 ... ...

對於 MySQL 8.0,您可以使用窗口函數SUM() OVER(PARTITION BY *expr* ORDER BY *expr*)來計算運行總計。

分貝<>小提琴

SELECT
    accountnumber, monthstart, monthend, numdaysinmonth,
    ROUND(feespaid, 2) AS feespaid, 
    ROUND(SUM(feespaid) OVER(PARTITION BY accountnumber ORDER BY monthstart), 2) AS ytdpaid
FROM (
    SELECT 
    accountnumber, monthstart, monthend,
    datediff(monthend, monthstart)+1 AS numdaysinmonth, 
    SUM(annualfee/365) AS feespaid
    FROM subscriptions s
    JOIN calendar c ON c.date BETWEEN s.startdate AND s.enddate
    -- since you mentioned 1 Jan to 31 July
    WHERE c.date BETWEEN '2022-01-01' AND '2022-07-31'     
    GROUP BY accountnumber, monthstart, monthend
    ORDER BY accountnumber, monthstart, monthend
) tmp
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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