分区总和不起作用
Posted
技术标签:
【中文标题】分区总和不起作用【英文标题】:Sum over partition not working 【发布时间】:2018-12-13 18:54:43 【问题描述】:我有一些关于分区函数的代码,但它不起作用。
我收到一条错误消息,上面写着
“销售”附近的语法不正确
有人知道为什么吗?看了其他分区问题,没找到答案,
代码(如下)应该从 Aggregated Sales History 表中选择 PriceZoneID 和 Sales,然后使用 OVER 函数汇总总销售额,并将该数据放入一个名为 Total Sales 的新列中。
然后它应该在一个名为 TotalSalesByZone 的新列中使用 OVER (PARTITION) 表达式汇总每个区域的销售额,然后按价格区域 ID 和销售额对数据进行排序
Select PriceZoneID,
Sales,
SUM(Sales) OVER () AS Total Sales,
SUM(Sales) OVER (PARTITION BY PriceZoneID) AS TotalSalesByZone
From AggregatedSalesHistory
ORDER BY PriceZoneID AND Sales;
(Partition By 将结果划分为分区,例如 Zones)
如果您能发布带有正确答案的代码,我们将不胜感激!
【问题讨论】:
你的错误是什么?预期结果?样本数据?为什么你想要所有列的总和?这可能是您的错误所在 你的问题是你选择的别名,特别是AS Total Sales
。列的别名/名称不能包含空格或其他特殊字符,除非别名/名称被引用:AS [Total Sales]
但是,理想情况下,不要在对象名称、别名中使用特殊字符。 CamelCase 完全可以接受:AS TotalSales
您好 Thomas,感谢您的及时回复。我收到一条错误消息 - “销售”附近的语法不正确。使用分区函数编写查询的更好方法是什么?你能给些建议么? TIA。
SUM(Sales) OVER (PARTITION BY PriceZoneID) AS TotalSalesByZone 。它也会抛出错误。因为分区需要按列排序。
@saravanatn 不,它没有。在SUM() (PARTITION BY...)
上添加ORDER BY
将导致SUM
成为“运行总数”,而不是累积总数。
【参考方案1】:
现在从 cmets 中出来,因为纠正其中的错误有点愚蠢。您的代码中有 1 个印刷错误,还有 1 个语法错误:
Select PriceZoneID,
Sales,
SUM(Sales) OVER () AS Total Sales, --There's a space in the alias
SUM(Sales) OVER (PARTITION BY PriceZoneID) AS TotalSalesByZone
FROM AggregatedSalesHistory
ORDER BY PriceZoneID AND Sales; --AND is not valid in an ORDER BY clause
正确的查询是:
Select PriceZoneID,
Sales,
SUM(Sales) OVER () AS TotalSales, --Removed Space
SUM(Sales) OVER (PARTITION BY PriceZoneID) AS TotalSalesByZone
FROM AggregatedSalesHistory
ORDER BY PriceZoneID, Sales; --Comma delimited
【讨论】:
好的,感谢整理。我很感激。当我运行整理后的代码时,我现在收到一个错误,指出对象名称“AggregatedSalesHistory”无效。你知道这意味着什么吗? @Mr2017 这就是它所说的意思;对象AggregatedSalesHistory
不存在。我曾假设您的对象名称在您提供的 SQL 中是正确的。我无法帮助您更正名称,因为我不知道它叫什么。您需要更正名称。
实际上,屏幕左上角有一个下拉部分,其中默认选项是“Master” - 当我将其更改为 PS55(包含汇总销售历史表的数据库时) ),查询有效。我需要确定是否可以将默认数据库从“Master”更改为“PS55”,因为这很容易忘记。
您可以更改登录的默认数据库是的。但是,如果您在 SSMS 中工作,通常最好将 USE [Your Database Name];
放在开头;只是为了确保。
查询正在运行!!欢呼!谢谢你的帮助!我现在唯一的疑问是它重复返回相同的结果。以上是关于分区总和不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用