2016-01-27 85 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