2015-10-19 32 views
0

假設(假設)我繼承了一個數據庫,並且在此數據庫中有一個表用於跟蹤我的特許展位中的庫存,[Purchases]計數我購買的庫存以及我的顧客製造。這遠非最佳解決方案,但它是存在的,我無法改變它。加入包含SUM()函數的兩個子查詢時的操作錯誤

[Purchases],有標誌,以表示改變是什麼(庫存買或庫存銷售),而我可以查詢該表通過SUM()只看到購買或銷售,甚至總數(每個項目,時間等)很容易。

表可能會是這個樣子:

Date | Flag | ItemNum | Item Name | Quantity | Unit Price 
10/19/2015 SOLD   001  SNICKERS  2   $1.00 
10/19/2015 BOUGHT  001  SNICKERS  72   $0.40 
10/18/2015 SOLD   034  GATORADE24OZ 3   $2.00 
10/18/2015 SOLD   021  PRETZEL   1   $2.00 
... 

這是很容易用這些數據來工作,但如果我想看到每個條目的變化庫存在一個時間框架,我可能會查詢表格兩次(一次爲SOLD,一次爲BOUGHT)。

SELECT 
    Q1.ItemNum, 
    Q1.QuantityIn, 
    Q2.QuantityOut, 
    (Q1.QuantityIn - Q2.QuantityOut) AS QuantityRem 
FROM 
    (
    SELECT 
     ItemNum, 
     SUM(Quantity) AS QuantityIn 
    FROM Purchases 
    WHERE Flag LIKE "BOUGHT" 
    GROUP BY ItemNum 
    ) 
    AS Q1 
    LEFT JOIN 
    (
    SELECT 
     ItemNum, 
     SUM(Quantity) AS QuantityOut 
    FROM Purchases 
    WHERE Flag LIKE "SOLD" 
    GROUP BY ItemNum 
    ) 
    AS Q2 
    ON Q1.ItemNum = Q2.ItemNum 

然而,這回吐Invalid Operation.而不是所需的結果。這兩個子查詢都是獨立工作的,如果我首先將一個子查詢放入一個表中,主查詢就可以工作。

當然還有其他的方法來解決這個問題,但假設在我的非假設情況下,我無法作出SOLD量負,UNION子查詢,並採取總和事後,是我對使用臨時表的唯一選擇?由於某些原因,在Jet中不支持兩個SUM()子查詢?在搜索解決方案時,我找不到任何東西。

+1

你缺少','在子查詢的'select's –

+0

兩個固定,良好的漁獲:因此,你可以嘗試沿着這些路線的東西。可悲的是,這個錯誤並不那麼簡單。 – Fritz

+0

請注意,即使您的查詢沒有發生錯誤,它也不會處理商品被出售但未被購買的情況,並且它不能正確處理商品被購買但未被出售的情況(所以'Q2。 QuantityOut'的左連接結果將是'NULL')。 –

回答

2

當你說你不能使SOLD數量爲負時,我想你的意思是你不能在基表中更改這些數量。但是,這並不妨礙在查詢中更改它們。 Access不支持標準SQL CASE表達式,但它支持其他條件表達式。

SELECT 
    ItemNum, 
    SUM(IIF(flag = 'BOUGHT', quantity, 0)) AS QuantityIn, 
    SUM(IIF(flag <> 'BOUGHT', quantity, 0)) AS QuantityOut, 
    SUM(IIF(flag = 'BOUGHT', quantity, -quantity)) AS QuantityChange 
FROM Purchases 
GROUP BY ItemNum 
+0

這個想法之前我曾經想過,但由於在全面問題中「Flag」字段更復雜(沒有多少理由),所以我很猶豫。我認爲這可能比我原先想的要容易。但明天我必須回到這裏。謝謝你的幫助! – Fritz