sql - 为什么 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
解决方案
混合窗口函数和聚合函数可能很棘手。你想要的是:
SUM(inv.ServicePrice) as TotalPrice,
SUM(SUM(inv.ServicePrice)) over () as TotalRevenue
注意额外的SUM()
. 内部是SUM()
结果集中的行上的。外层是窗口函数,它对所有行的值求和。
推荐阅读
- c++ - 如何在循环中循环递增和递减 26 个拉丁字符
- jupyter-notebook - 干净地卸载损坏的 jupyter nbextension
- python - 如何将登录名从外部文件更改为循环?
- mysql - 当我在循环 TimeoutError: ResourceRequest timed out 内启动多个选择查询时出现错误
- c - 增加二维数组大小后的变量变化
- docker - pod 不会连续生成应用程序日志
- javascript - 为什么firebase在父子之间创建一个随机标识符?
- javascript - 带有x和y值的highcharts面积图?
- php - PHP中的self和Self有区别吗?
- windows - 将 .text、.rdata、.data、.code 放在一个 exe(cutable) 文件中