我有两张 table ,一张 Orders
包含用户订单列表和 OrderShippingCosts
的表表,其中包含基于 OrderTypeID
的每件商品的运输价格在 Orders
table 。
我正在运行如下查询来计算总运费:
SELECT
SUM(CASE
WHEN OR.OrderTypeID = 1
THEN (SELECT CostOfShippingSmallParcel
FROM OrderShippingCosts)
ELSE (SELECT CostOfShippingBigParcel
FROM OrderShippingCosts)
END) AS TotalShippingCost
FROM
Orders AS OR
但我收到以下错误:
Cannot perform an aggregate function on an expression containing an aggregate or a subquery
有人知道我的查询有什么问题吗?
最佳答案
功能 SUM
在输入上接受一个表达式,它计算为单个数据值,而不是数据集。 Expression来自 MSDN 的定义:
Is a combination of symbols and operators that the SQL Server Database Engine evaluates to obtain a single data value.
您试图将数据集(子查询的结果)传递给 SUM
函数,而不是单个数据值。这是您尝试查询的简化:
SELECT SUM(SELECT Number FROM SomeTable)
这是无效的。有效的查询是:
SELECT SUM(Value) FROM SomeTable
在您的特定情况下,您似乎缺少 JOIN
。您的原始逻辑将为 Orders
表的每一行生成整个 OrderShippingCosts
表的摘要。我想,应该是这样的:
SELECT
SUM
(
CASE
WHEN ord.OrderTypeID = 1 THEN ship.CostOfShippingSmallParcel
ELSE ship.CostOfShippingBigParcel
END
) TotalShippingCost
FROM Orders AS ord
JOIN OrderShippingCosts ship ON /* your search condition, e.g.: ord.OrderID = ship.OrderID */
顺便说一句,使用保留符号作为别名、名称等并不是一个好主意。在您的查询中,您使用 OR
作为 Orders
表的别名。符号 OR
为逻辑 or
保留手术。如果您确实需要使用保留符号,请将其包装在 [
和 ]
方括号中。看here和 here了解更多详情。
关于sql - 将 SQL SUM 与包含内部 SELECT 的 Case 语句一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38350150/