我有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
答案 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