繁体   English   中英

SQL查询根据时间范围计算金额

[英]SQL query to calculate amount based on time range

我需要帮助来根据时间范围计算金额。 另外,需要拿出整月的计算。 这是基于入住日期的班次交易计算。

例如:Shift 01/05/2019从8:00:00开始,到02/05/2019 07:59:59结束这是我的sql

Select CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) Date, 
SUM(P.Amount - B.TourismTaxAmount) Amount 
From Bookings B 
Inner Join BookingPayments BP On B.ID = BP.BookingID 
Inner Join Payments P On P.ID = BP.PaymentID 
Where BookingStatus IN (2,3,4,6) and 
IsNull(CheckInDate, DateCheckIn) >= '2019-05-01 08:00:00' and
IsNull(CheckInDate, DateCheckIn) <= '2019-05-02 07:59:59'  
group by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) 
order by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) 

以下是输出:

-------------------------
| Date         | Amount |
-------------------------
| 2019-05-01   | 123.00 |
| 2019-05-02   | 456.00 |
-------------------------

这个SQL已经正确了..但是如何使输出如下:

-------------------------
| Date         | Amount |
-------------------------
| 2019-05-01   | 579.00 |
-------------------------

从上面..我需要按日期和输出生成每月班次摘要如下:

-------------------------
| Date         | Amount |
-------------------------
| 2019-05-01   | 579.00 |
| 2019-05-02   | 891.00 |
| 2019-05-03   | 721.00 |
| ..........   | .....  |
| ..........   | .....  |
-------------------------

感谢您的帮助和解决方案..谢谢

使用窗口函数sum()和按日期排序

Select CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) Date, 
SUM(P.Amount - B.TourismTaxAmount) over(order by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120)) Amount 
From Bookings B 
Inner Join BookingPayments BP On B.ID = BP.BookingID 
Inner Join Payments P On P.ID = BP.PaymentID 
Where BookingStatus IN (2,3,4,6) and 
IsNull(CheckInDate, DateCheckIn) >= '2019-05-01 08:00:00' and
IsNull(CheckInDate, DateCheckIn) <= '2019-05-02 07:59:59'  

order by CONVERT(char(10), IsNull(CheckInDate, DateCheckIn), 120) 

对于Sql-Server,我首先创建一个SQL,它以正确的格式带来日期列

Select Year(myDate)*10000+Month(myDate)*100+Day(myDate) as MyNewDate ...

如果您通过WITH在CTE中使用查询,那么对它进行分组会更容易。

在进行聚合之前,只需减去8小时。 您可以最轻松地使用所需的日期表达式定义变量(井,列),从而产生:

Select convert(char(10), v.dte, 120) as Date, 
       sum(P.Amount - B.TourismTaxAmount) as Amount 
From Bookings B Inner Join
     BookingPayments BP
     On B.ID = BP.BookingID Inner Join
     Payments P
     On P.ID = BP.PaymentID cross apply
     (values (convert(date, dateadd(hour, -8, coalesce(CheckInDate, DateCheckIn))))
     ) v(dte)
Where BookingStatus in (2, 3, 4, 6) and 
      v.dte >= '2019-05-01' and
      v.dte < '2019-05-02'  
group by v.dte 
order by v.dte;

这也可以很容易地延长到多个日期或月份。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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