sql - 将 SQL SUM 与包含内部 SELECT 的 Case 语句一起使用

标签 sql sql-server tsql

我有两张 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 保留手术。如果您确实需要使用保留符号,请将其包装在 [] 方括号中。看herehere了解更多详情。

关于sql - 将 SQL SUM 与包含内部 SELECT 的 Case 语句一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38350150/

相关文章:

sql-server - 将 DbVisualizer 与 Azure SQL 结合使用的数据库驱动程序是什么?

c# - 我是否应该避免在测试中访问数据库作为用有效数据填充对象的快捷方式?

sql-server - 在位置索引中查找二元组

sql - 索引是否加快了两个日期时间值的 DATEDIFF 的计算?

mysql - SQL 选择不匹配特定选择的地方

sql - 如何从 SQL Server 中由二进制文字组成的字符串变量设置二进制值?

SQL SERVER 2005 USE 语句

sql-server - 每年获取库存余额

INTERSECT 的 mysql 替代品

sql - 对表建立索引以获得更好的查询性能