2016-01-27 87 views
0

我有2个数据库表。跟踪向公司发出订单的位置,另一个跟踪向公司支付订单的付款。SQL语句中的语法错误

我想创建一个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 

这里是我的case语句尝试:

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 
+0

我删除了多余的数据库标签。随意为您实际使用的数据库添加标签。 –

+2

奇怪,你甚至说你正在使用'CASE',但我没有在任何地方看到'CASE' – Lamak

+0

看起来像是case case语句的一部分(例如'WHEN'和'THEN',但你没有't包括'CASE'和'END') – Bridge

回答

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; 

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

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

+0

非常感谢您的帮助!不幸的是,我从来没有建立数据库,我正在处理给我的东西。 –

+0

不幸的是,我得到了该代码的错误!我将所有表别名替换为正确的别名。 –

+0

我想我必须使用ISNULL语句而不是Coalesce语句,我只是不确定语法是如何工作的。我试图解决这个问题 –

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