簡體   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