【问题标题】:SQL Syntax error in case statementcase语句中的SQL语法错误
【发布时间】:2016-01-27 20:26:52
【问题描述】:

我有 2 个数据库表。一个跟踪向公司下达的订单,另一个跟踪向公司支付的订单。

我想创建一个 SQL 查询,它显示每个订单 ID、订单的总金额以及尚未支付的订单未结金额。 客户可以“分期付款”说,所以目的是计算总欠款并显示出来。

这是我到目前为止所拥有的,但是当没有付款时它会返回“null”。这显然意味着没有基于特定订单的记录,因此客户支付的总金额= 0。因此未结金额等于总金额。

我希望我的 sql 代码在全部金额仍未结清时显示订单的总金额,而不是 null。

如何做到这一点?

我尝试了一个 case 语句,但我认为我的语法错误。

这是没有case语句的版本,当没有付款时返回null:

 SELECT
     pb_orders.id AS 'Order ID', pb_orders.order_total AS 'Total',
     SUM(pb_payments.amount) AS 'Amount Paid', pb_orders.order_total -
     SUM(pb_payments.amount) AS 'Outstanding Amount'
 FROM 
     pb_orders 
 INNER JOIN 
     pb_payments ON pb_orders.id = pb_payments.link_id 
 WHERE 
     pb_orders.id = 1556

这是我对案例陈述的尝试:

SELECT
    pb_orders.id AS 'Order ID', pb_orders.order_total AS 'Total',
    SUM(pb_payments.amount) AS 'Amount Paid' 
        WHEN 'Amount Paid' = 'NULL' 
           THEN 'Amount Paid' = pb_orders.order_total, 
    pb_orders.order_total - SUM(pb_payments.amount) AS 'Outstanding Amount',  
FROM 
    pb_orders 
INNER JOIN 
    pb_payments ON pb_orders.id = pb_payments.link_id 
WHERE 
    pb_orders.id = 1555

【问题讨论】:

  • 我删除了无关的数据库标签。随意为您实际使用的数据库添加标签。
  • 奇怪,您甚至说您使用的是CASE,但我在任何地方都没有看到CASE
  • 看起来有部分 case 语句的语法(例如 WHENTHEN,但你没有包括 CASEEND

标签: sql


【解决方案1】:

您需要 coalesce()NULL 值转换为其他值:

SELECT o.id AS OrderID, o.order_total AS Total,
       sum(p.amount) AS AmountPaid,
       (o.order_total - coalesce(sum(p.amount), 0) ) AS OutstandingAmount
FROM pb_orders o INNER JOIN
     pb_payments p
     ON o.id = p.link_id 
WHERE o.id = 1556;

另请注意,表别名使查询更易于编写和阅读。

我建议您不要使用单引号来定义列别名。这是一个导致麻烦的坏习惯——有一天,你会用单引号引用一列,但该列将被解释为字符串常量。

【讨论】:

  • 非常感谢您的帮助!不幸的是,我从未设置数据库,我正在使用给我的东西。
  • 不幸的是,我的代码出错了!我将所有表别名替换为正确的别名。
  • 我想我必须使用 ISNULL 语句而不是 Coalesce 语句,我只是不确定语法是如何工作的。不过我正在努力解决
  • Answer is missing a ) before the AS, IFNULL 也是我的偏好,但仍然需要 ),或者 ( 从 @ 之前删除987654329@
【解决方案2】:

使用 ISNULL:

 SELECT
     pb_orders.id AS 'Order ID', 
     pb_orders.order_total AS 'Total',
     SUM(ISNULL(pb_payments.amount, 0)) AS 'Amount Paid', 
     pb_orders.order_total - SUM(ISNULL(pb_payments.amount, 0)) AS 'Outstanding Amount'
 FROM 
     pb_orders 
 INNER JOIN 
     pb_payments ON pb_orders.id = pb_payments.link_id 
 WHERE 
     pb_orders.id = 1556

使用公用表表达式预处理可能的空值:

    DECLARE @orderId INT = 1556
    ;WITH [SummedOrderAmount] AS (
        SELECT
          SUM(ISNULL([amount], 0)) AS [AmountPaid]
        FROM
          pb_payments 
        WHERE
          pb_payments.link_id = @orderId
     )
      SELECT
         pb_orders.id AS 'Order ID', pb_orders.order_total AS 'Total',
         s.[AmountPaid] AS 'Amount Paid', 
         pb_orders.order_total - s.[AmountPaid] AS 'Outstanding Amount'
     FROM 
-- just use a cartesian join because you are looking at a single record.
         pb_orders, 
         [SummedOrderAmount] s
     WHERE 
         pb_orders.id = @orderId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2012-07-07
    • 1970-01-01
    • 2011-10-27
    • 2014-08-09
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多