[英]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.