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