首页 > 解决方案 > 为什么 Over() 不能处理一列的总和?

问题描述

我试图获得 TotalPrice 的总和但抛出错误:

选择列表中的“Invoices.ServicePrice”列 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

ALTER PROCEDURE [dbo].[SalesReport] 

        @FromDate date= '11-May-2018',
        @ToDate date= '05-Jun-2018'

AS
BEGIN
        Set @ToDate= case when @ToDate IS NULL then Convert(varchar(11), getdate(), 106) else @ToDate end

        Select ROW_NUMBER() over (partition by b.BookingID order by b.BookingID) as ID, inv.InvoiceNo, 
        convert(varchar(11),inv.EntryDateTime,106) as EntryDateTime, Count(s.ServiceID) as TotalServices,
        SUM(inv.ServicePrice) as TotalPrice, SUM(inv.ServicePrice) over() as TotalRevenue
        from Invoices inv
        Inner Join Bookings b
        ON b.BookingID= inv.fk_BookingID
        Inner Join ZahidCarWashDB.dbo.Services s
        ON s.ServiceID= inv.fk_ServiceID
        where Convert(varchar(11), inv.EntryDateTime, 106) between @FromDate and @ToDate
        group by convert(varchar(11),inv.EntryDateTime,106), inv.InvoiceNo, b.BookingID



END

标签: sqlsql-servertsqlstored-proceduressql-server-2012

解决方案


混合窗口函数和聚合函数可能很棘手。你想要的是:

SUM(inv.ServicePrice) as TotalPrice,
SUM(SUM(inv.ServicePrice)) over () as TotalRevenue

注意额外的SUM(). 内部是SUM()结果集中的行上的。外层是窗口函数,它对所有行的值求和。


推荐阅读