将SQL SUM与包含内部SELECT

时间:2016-07-13 11:15:59

标签: sql sql-server tsql

我有两个表,一个Orders表,其中包含一个用户订单列表和一个OrderShippingCosts表,其中包含根据OrderTypeID中每个项目发送的价格{1}}表。

我正在运行如下的查询来计算总运费:

Orders

但我收到以下错误:

  

无法对包含聚合或子查询的表达式执行聚合函数

有谁知道我的查询有什么问题?

5 个答案:

答案 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操作。如果您确实需要使用保留符号,请将其包装到[]方括号中。查看herehere了解更多详情。

答案 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