当前位置: 首页 > 面试题库 >

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

云远
2023-03-14
问题内容

我有两个表,一个Orders包含一个html" target="_blank">用户订单列表表和OrderShippingCosts其中包含的价格发售基于对每个项目表OrderTypeIDOrders表中。

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

SELECT
    SUM(CASE 
           WHEN OR.OrderTypeID = 1 
              THEN (SELECT CostOfShippingSmallParcel 
                    FROM OrderShippingCosts) 
              ELSE (SELECT CostOfShippingBigParcel 
                    FROM OrderShippingCosts) 
        END) AS TotalShippingCost
FROM 
    Orders AS OR

但我收到以下错误:

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

有人知道我的查询出了什么问题吗?


问题答案:

函数在输入中SUM采用一个 表达式 ,该 表达式的
结果为单个数据值,而不是数据集。来自MSDN的 表达式 定义:

是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操作。如果你真的需要使用保留的符号,把它包装成[]方括号。看看这里和这里了解更多详情。



 类似资料:
  • 它为集合中的每个元素重复一组语句。 此循环用于访问和操作数组或VB.Net集合中的所有元素。 此循环结构的语法是 - For Each element [ As datatype ] In group [ statements ] [ Continue For ] [ statements ] [ Exit For ] [ statements ] Next [ el

  • 可以将select语句作为外部select语句的语句序列的一部分。 即使内部和外部选择的case常量包含公共值,也不会产生冲突。 例子 (Example) Module decisions Sub Main() 'local variable definition Dim a As Integer = 100 Dim b As Integer = 200

  • 问题内容: 我已经看过类似于此问题的各种问答,但是还没有找到解决方案。 我所拥有的一个枚举代表了观看电视指南的不同方式… 在NDroid 类中 …当用户更改视图时,事件处理程序会收到0-2的值,而我想做这样的事情… 在Android 事件处理程序中 我已经习惯了C#枚举和select / case语句,这些语句允许类似上面的内容,而且我知道Java的处理方式有所不同,但是我根本无法理解需要做什么。

  • 本文向大家介绍VBS基础篇 - 条件语句(if与Select Case),包括了VBS基础篇 - 条件语句(if与Select Case)的使用技巧和注意事项,需要的朋友参考一下 If...Then...Else 在下面的情况中,您可以使用 If...Then...Else 语句: 在条件为 true 时,执行某段代码 选择两段代码之一来执行时 要运行多行代码,必须使用多行(或块)语法,多行(或块

  • 问题内容: 我正在使用JDBC模板,并希望使用准备好的语句从数据库中读取数据。我遍历.csv文件中的许多行,并且在每一行上执行一些具有相应值的SQL选择查询。 我想加快从数据库中的读取速度,但是我不知道如何使JDBC模板与准备好的语句一起使用。 有PreparedStatementCreator和PreparedStatementSetter。如本例所示,它们都是使用匿名内部类创建的。但是在Pre

  • 问题内容: 我有一个查询应该这样运行- 我如何在T-SQL中实现此目标而不为每个子句编写单独的查询?目前我正在运行它 只是为了根据值选择不同的列而已,这只是大量的冗余代码。还有其他选择吗? 问题答案: 此处仅需注意,出于优化的原因,最好有3个单独的SELECTS。如果只有一个SELECT,则生成的计划将必须投影所有列col1,col2,col3,col7,col8等,尽管取决于运行时@var的值,