2012-11-23 78 views
5

剛剛開始實習並被委任了一些SQL。發現它有點棘手。感謝任何幫助。謝謝!SQL;總和2個字段,然後將它們加在一起

任務:

「這將是可以寫入以下內容的警報顯示時,由於在接下來的一個月未結銷售訂單組合(添加)與開銷售發票誰所有的客戶,他們超過他們的信用額度。「

我的建議邏輯:

  1. 首先我想要做的是SUM所有銷售訂單,在未來一個月內,對每一個客戶(SALES表)。

  2. 接下來,SUM爲每個客戶打開所有未結髮票,即計算出每個客戶欠的總金額(在INVOICES表中)。

  3. 我然後要添加的1和2的結果一起,由相應的customer_id

  4. 接着比較從上述3的計算,以查看是否其比每個客戶的信用額度更大。

如果3中的總和超過信用額度,那麼只有這些公司應顯示在生成的表中。對於結果表的理想格式將

Cust_ID|Name|Sum_sales_orders (1.above)|Sum_open_invoices (2.above)| Total_orders&invoices 
---------------------------------------------------------------------------- 
    1 | A | 25000     | 333      | 25333 
     | |       |       | 

我到目前爲止的代碼是

SELECT arc.company, arc.credit_limit, 
    sum (ard.unit_price * ard.invoice_qty) as open_invoice_total, 
    sum (od.total_qty_ord * od.unit_price) as open_orders_total 
FROM iqms.arprepost_detail ard, iqms.arprepost arp, iqms.arcusto arc, iqms.ord_detail od, iqms.orders o 
WHERE ard.arprepost_id = arp.id 
    and arc.id = o.arcusto_id and o.id = od.orders_id 
    and arp.arcusto_id = arc.id 
    GROUP BY arc.company, arc.credit_limit 

我認爲這是在和計算正確的總計()函數?還是我錯了?我如何添加open_invoice_total和open_orders_total?然後將它們與credit_limit進行比較?

我希望你們明白我在做什麼。我在這裏先向您的幫助表示感謝! :)

+1

'SELECT arc.company ....... GROUP BY ..... HAVING sum(ard.unit_price * ard.invoice_qty)+ sum(od.total_qty_ord * od.unit_price)> arc.credit_limit' –

回答

3

您可以使用HAVING子句來檢查總計的總和是否超過信用額度,如下所示。爲了可讀性,我還用INNER JOINS替換了WHERE子句中的連接。

SELECT arc.company, arc.credit_limit, 
     sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
     sum(od.total_qty_ord * od.unit_price) as open_orders_total 
FROM iqms.arprepost_detail ard 
     INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id 
     INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id 
     INNER JOIN iqms.ord_detail od ON o.id = od.orders_id 
     INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
    GROUP BY arc.company, arc.credit_limit 
    HAVING sum(ard.unit_price * ard.invoice_qty) + sum(od.total_qty_ord * od.unit_price) > arc.credit_limit; 

編輯

只是爲了澄清民主黨評論,GROUP BY不允許aliases說明書中,因此上述查詢「重複」的總和在SELECT和在HAVING。這可以通過嵌套來消除,但請注意,HAVING已使用WHERE進行切換。因此,查詢的機版本是:

SELECT company, credit_limit, open_invoice_total, open_orders_total 
FROM 
(
    SELECT arc.company, arc.credit_limit, 
      sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
      sum(od.total_qty_ord * od.unit_price) as open_orders_total 
    FROM iqms.arprepost_detail ard 
      INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id 
      INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id 
      INNER JOIN iqms.ord_detail od ON o.id = od.orders_id 
      INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
     GROUP BY arc.company, arc.credit_limit 
) AS nested 
WHERE (open_invoice_total + open_orders_total) > arc.credit_limit; 

而且,如果你願意的話,熱膨脹係數可能使這個更具可讀性:

;WITH nested AS 
(
    SELECT arc.company, arc.credit_limit, 
      sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
      sum(od.total_qty_ord * od.unit_price) as open_orders_total 
    FROM iqms.arprepost_detail ard 
      INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id 
      INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id 
      INNER JOIN iqms.ord_detail od ON o.id = od.orders_id 
      INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
     GROUP BY arc.company, arc.credit_limit 
) 
SELECT company, credit_limit, open_invoice_total, open_orders_total 
    FROM nested 
    WHERE (open_invoice_total + open_orders_total) > arc.credit_limit; 
+2

+1:另一種選擇,我有點更喜歡*(因爲它保持不重複自己的原則)*是將查詢包裝在外部查詢中'SELECT * FROM(theQuery)WHERE a + b> c'所以以避免將'a'和'b'的計算寫出兩次。 * [也沒有真正可測量的性能差異。] * – MatBailie

+0

@Dems謝謝 - 澄清。 – StuartLC

0

這就是偉大的球員。然而,我還有一個問題。

我可以有條件地做和場和?例如,我只希望'open_orders_total'受到下個月內到期的訂單的影響(sysdate + 31)。因此,如果它們超出此範圍(due_date> sysdate + 31),它將傳遞一些訂單並且不會將它們添加到運行總計中。這可以實現sum()函數嗎?

也許這樣的事情?

SELECT arc.company, arc.credit_limit, 
    SUM ((ard.unit_price*ard.invoice_qty) * CASE arp.due_date WHEN arp.due_date < sysdate+'31' and arp.due_date >= sysdate THEN 1 ELSE 0 END) as open_invoice_total, 

這是我第一次使用CASE,所以道歉,如果我走的方式之一。像這樣的東西可以實施嗎?

在我看來,SUM WHERE子句看起來合乎邏輯。 EG:

Sum (quantity*price) WHERE due_date < (sysdate+31) 

再次感謝您的所有幫助!

+0

:如果你有什麼想法,爲什麼不試試這個,看看你是否得到了預期的輸出。如果你沒有得到正確的輸出,那麼來到SO,任何人都會幫助你。 –

相關問題