繁体   English   中英

Sql Server 选择查询:按月表的总和和最后输入

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

我想做一个选择查询,按月返回每个日期组:

  • 支付总额(Sum)
  • 按月最后剩余

| 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM