[英]Sql Server select query : Sum and Last input by month of table
我有一張這樣的桌子:
-------------------------------------------------
Id | Date | Paid | Remaining |
--------------------------------------------------
1 | 2020-02-02 12:57:59.950 |500.00 |NULL |
2 | 2020-02-02 12:57:59.950 |20.00 |NULL |
3 | 2020-02-19 12:10:59.950 |300.00 |NULL |
4 | 2020-02-20 12:10:59.950 |100.00 |150.00 |
5 | 2020-02-27 12:10:59.950 |100.00 |70.00 |
6 | 2020-03-02 12:57:59.950 |500.00 |50.00 |
7 | 2020-03-19 12:10:59.950 |300.00 |NULL |
8 | 2020-03-20 12:10:59.950 |100.00 |20.00 |
9 | 2020-03-27 12:10:59.950 |60.00 |60.00 |
我想做一個選擇查詢,按月返回每個日期組:
| Date | TotalPaid | LastRemaining |
----------------------------------------
| 2020-02-01 |1020.00 | 70.00
| 2020-03-01 |960.00 | 60.00
這是一種方法:
select yyyymm, sum(paid),
max(case when seqnum = 1 then remaining end) as last_remaining
from (select t.*, yyyymm,
row_number() over (partition by v.yyyymm order by date desc) as seqnum
from t cross apply
(values (datefromparts(year(date), month(date), 1))
) v(yyyymm)
) t
group by yyyymm
order by yyyymm;
您實際上也可以在沒有子查詢的情況下執行此操作,但它更混亂:
select distinct v.yyyymm,
sum(t.paid) over (partition by v.yyyymm) as paid,
first_value(t.remaining) over (partition by v.yyyymm order by t.date desc) as last_remaining
from t cross apply
(values (datefromparts(year(date), month(date), 1))
) v(yyyymm);
這使用帶有窗口函數的select distinct
作為“first()”/“last()”聚合函數的最后一個的變通方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.