Почему мой запрос возвращает сумму для всех строк вместо единственной совпадающей? - PullRequest
0 голосов
/ 04 сентября 2018

Я написал этот запрос. Это работает, но TotalCost остается одинаковым для разных параметров. Я хочу, чтобы он изменил свое значение соответственно. В настоящее время он принимает сумму всех строк, но он должен принимать только сумму строк, возвращаемых запросом.

alter PROCEDURE [dbo].[ServicesDetailedReportPartyWise] 

        @FromDate date= '01/Jun/2010',
        @ToDate date= '01/Oct/2018',
        @PartyName varchar(20)='B'

AS
BEGIN
        Set @ToDate= ISNULL(@ToDate, getdate());

        Select inv.InvoiceNo, Convert(varchar(11),inv.EntryDateTime,106) as EntryDateTime, s.ServiceName, c.VehicleRegNo, inv.ServicePrice, c.CustomerName, inv.Party as PartyName,
        inv.fk_BookingID, t.TotalCost, SUM(t.TotalCost) over () as TotalRevenue, ISNULL(SUM(inv.OwnerCommission) over(),0) as TotalCommission, ISNULL(inv.OwnerCommission,0) as Commission
        from dbo.[Services] s
        inner join invoices inv
        on inv.fk_ServiceID= s.ServiceID
        inner join customers c
        on c.CustomerID= inv.fk_CustomerID
        Cross join (Select SUM(inc.ServicePrice) as TotalCost from dbo.Invoices inc) t
        where inv.Party= @PartyName AND (convert(date, inv.EntryDateTime) between @FromDate and @ToDate)
        order by inv.EntryDateTime desc


END

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Ваш cross join ничего не делает с фильтрацией, если вы идете с этим, вам нужно будет выполнить некоторую фильтрацию, аналогичную outer query.

Другой вариант - применить окно функцию:

select inv.InvoiceNo, Convert(varchar(11),inv.EntryDateTime,106) as EntryDateTime, 
       s.ServiceName, c.VehicleRegNo, inv.ServicePrice, c.CustomerName, inv.Party as PartyName,
       inv.fk_BookingID, 
       sum(inv.TotalCost) over (partition by . . .) as TotalCost, 
       sum(inv.TotalCost) over () as TotalRevenue, 
       isnull(sum(inv.OwnerCommission) over(), 0) as TotalCom
       mission, isnull(inv.OwnerCommission,0) as Commission
 . . .
0 голосов
/ 04 сентября 2018

TotalCost равно t.TotalCost, где t определяется как:

(Select SUM(inc.ServicePrice) as TotalCost from dbo.Invoices inc) t

Этот подзапрос не фильтруется вообще и представляет собой просто сумму по всей таблице dbo.Invoices - это одна ячейка, которую вы затем перекрестно соединили со всеми строками.

Итак: вот почему это не меняется.

Если вы хотите, чтобы сумма превышала inv, вам необходимо выполнить группирование и суммирование по группам.

...