我有两个表,一个Orders
表,其中包含一个用户订单列表和一个OrderShippingCosts
表,其中包含根据OrderTypeID
中每个项目发送的价格{1}}表。
我正在运行如下的查询来计算总运费:
Orders
但我收到以下错误:
无法对包含聚合或子查询的表达式执行聚合函数
有谁知道我的查询有什么问题?
答案 0 :(得分:2)
错误消息是明确的,您可以通过连接来避免它:
SELECT
SUM(CASE WHEN [OR].OrderTypeID = 1
THEN CostOfShippingSmallParcel
ELSE CostOfShippingBigParcel END) AS TotalShippingCost
FROM Orders [OR]
CROSS JOIN OrderShippingCosts
答案 1 :(得分:2)
函数SUM
在输入上获取表达式,它将计算为单个数据值,而不是数据集。来自MSDN的Expression定义:
是SQL Server数据库引擎评估的符号和运算符的组合,以获得单个数据值。
您尝试将SUM
函数传递给数据集(这是子查询的结果),而不是单个数据值。这简化了您要查询的内容:
SELECT SUM(SELECT Number FROM SomeTable)
无效。有效查询将是:
SELECT SUM(Value) FROM SomeTable
在您的特定情况下,您似乎错过了JOIN
。您的原始逻辑将导致OrderShippingCosts
表的每一行的整个Orders
表的摘要。我想,它应该是这样的:
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了解更多详情。
答案 2 :(得分:1)
你可以尝试这样......
SELECT
CASE WHEN OR.OrderTypeID = 1
THEN (SELECT SUM(CostOfShippingSmallParcel) FROM OrderShippingCosts)
ELSE (SELECT SUM(CostOfShippingBigParcel) FROM OrderShippingCosts) END AS TotalShippingCost
FROM Orders AS OR
让我知道
答案 3 :(得分:1)
试试这个
SELECT
ISNULL
(
SUM
(
CASE
WHEN O.OrderTypeID = 1 THEN C.CostOfShippingSmallParcel
ELSE C.CostOfShippingBigParcel END
), 0
) AS TotalShippingCost
FROM
Orders AS O LEFT JOIN
OrderShippingCosts C ON O.Id = C.OrderId -- Your releation id
答案 4 :(得分:1)
select sum (or.TotalShippingCost)
FROM
SELECT
(CASE WHEN OR.OrderTypeID = 1
THEN (SELECT CostOfShippingSmallParcel FROM OrderShippingCosts)
ELSE (SELECT CostOfShippingBigParcel FROM OrderShippingCosts) END) AS TotalShippingCost
FROM Orders AS OR