SQL-запрос для расчета суммы на основе временного диапазона - PullRequest
3 голосов
/ 06 мая 2019

Мне нужна помощь для расчета суммы на основе временного диапазона.Также нужно придумать расчет на весь месяц.Это расчет сменной транзакции, основанный на дате регистрации.

Например: 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 |
| ..........   | .....  |
| ..........   | .....  |
-------------------------

Благодарим Вас за помощь и решения. Спасибо

Ответы [ 3 ]

2 голосов
/ 06 мая 2019

использовать оконную функцию 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) 
1 голос
/ 06 мая 2019

Просто вычтите 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;

Это также легко распространится на несколько дат или месяцев.

1 голос
/ 06 мая 2019

Для Sql-сервера я сначала создал бы SQL, который возвращает столбец даты в правильном формате с

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

Тогда сгруппировать его проще, если использовать запрос внутри CTEчерез СО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...