case语句中的SQL语法错误

时间:2016-01-27 20:26:53

标签: sql

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

我想创建一个SQL查询,它显示每个订单ID,订单总金额以及尚未支付的订单未结清金额。 允许客户以“分期付款”的方式付费说,所以目的是计算未付款总额并显示它。

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

我希望我的sql代码在整个金额尚未结清时显示订单总金额,而不是空。

如何做到这一点?

我尝试了一个案例陈述,但我认为我的语法是错误的。

这是没有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

2 个答案:

答案 0 :(得分:3)

您需要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;

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

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

答案 1 :(得分:0)

使用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