2016-01-05 9 views
0

我需要我購買的物品和物品我賣了,我在這個表需要兩列之間,如果第二個有空項,它會顯示在第一列

ID |ItemName| PriceOfUnit | NumberOfItems I bought |DateIBought| 
    1 | tea |  3  |   6   |15/11/2015 | 
    2 | coffee |  5  |   4   |16/11/2015 | 
    3 | tea |  4  |   10   |20/12/2015 | 
    4 | juice |  5  |   15   | 1/1/2016 | 
    5 | coffee |  3  |   5   | 15/3/2016 | 
    6 | water |  5  |   2   | 16/4/2016 | 
購買的物品之間的差數之差

和物品我賣是在這個表

ID |ItemName| PriceOfUnit | NumberOfItems I sold |DateIBought| 
    1 | coffee |  5  |   6   | 1/1/2016 | 
    2 | tea |  5  |   9   | 15/3/2016 | 
    3 | coffee |  4  |   2   | 20/4/2016 | 
    4 | juice |  5  |   11   | 1/1/2016 | 

我需要在MS Access查詢,SQL查詢或聯合查詢得到這個結果:

ID |ItemName| NumberOfItems I have | 
    1 | coffee |   1   | 
    2 | tea |   7   | 
    3 | juice |   4   | 
    4 | water |   2   | 

NumberOfItems I have = NumberOfItems I bought - NumberOfItems I sold

我想這

Q1:

SELECT ItemName, SUM(bought) as SumBought 
FROM tBought GROUP BY ItemName 

Q2:

SELECT ItemName, SUM(sold) as SumSold 
FROM tSold GROUP BY ItemName 

Q3:

SELECT q1.ItemName, (SumBought - SumSold) as difference 
FROM q1 inner join q2 on q1.ItemName = q2.ItemName 

,我得到這樣的結果

ID |ItemName| NumberOfItems I have | 
    1 | coffee |   1   | 
    2 | tea |   7   | 
    3 | juice |   4   | 

所有我現在需要的是..顯示NumberOfItems I bought,如果我不賣這個項目的任何東西
因爲這個例子是「水」

+0

我不明白id列。如果沒有意義,那就擺脫它。另外,我會將其作爲單個交易表執行。 – Strawberry

+0

好吧,無論ID列,我如何得到我想要的結果 –

+0

你快到了。看看[OUTER JOINS](https://msdn.microsoft.com/en-us/library/bb208894(v = office.12).aspx)。目前,您的INNER JOIN只會返回在已售出的表格中購買1個或多個條目的商品。 –

回答

-1

我想你可以改變你的最後一個查詢,以獲得Q1(購買物品)中的物品,即使它們沒有被出售。

SELECT q1.ItemName 
    , (q1.SumBought - ISNULL(q2.SumSold, 0)) as difference 
    from q1 
    LEFT 
OUTER 
    join q2 
    on q1.ItemName = q2.ItemName 

希望這會有所幫助。

+0

謝謝你,它工作:)) –

+0

@ahmedsaber這絕對不'工作' - 至少不是根據您的規格。 – Strawberry

0
DROP TABLE IF EXISTS bought; 

CREATE TABLE bought 
(item VARCHAR(12) NOT NULL,unit_cost INT NOT NULL,quantity INT NOT NULL,purchase_date DATE NOT NULL,PRIMARY KEY(purchase_date,item)); 

INSERT INTO bought VALUES 
('tea',3,6,'2015-11-15'), 
('coffee',5,4,'2015-11-16'), 
('tea',4,10,'2015-12-20'), 
('juice',5,15,'2016-01-01'), 
('coffee',3,5,'2016-03-15'), 
('water',5,2,'2016-04-16'); 

DROP TABLE IF EXISTS sold; 

CREATE TABLE sold 
(item VARCHAR(12) NOT NULL,unit_cost INT NOT NULL,quantity INT NOT NULL,sale_date DATE NOT NULL,PRIMARY KEY(sale_date,item)); 

INSERT INTO sold VALUES 
('coffee',5,6,'2016-01-01'), 
('tea',5,9,'2016-03-15'), 
('coffee',4,2,'2016-04-20'), 
('juice',5,11,'2016-01-01'); 

SELECT item 
    , SUM(quantity) total 
    FROM 
    (
     SELECT item,quantity FROM bought 
     UNION 
     SELECT item,quantity*-1 FROM sold 
    ) x 
GROUP 
    BY item; 
+--------+-------+ 
| item | total | 
+--------+-------+ 
| coffee |  1 | 
| juice |  4 | 
| tea |  7 | 
| water |  2 | 
+--------+-------+ 

這是好的,但它會更容易,如果所有交易都在一個表中舉行,無論是銷售負數量或一個單獨的列,以確定銷售和購買

-1

以上管理現行辦法,你可以簡單地改變你的第三個查詢做outer join instead of inner join

SELECT q1.ItemName, 
     (ISNULL(SumBought, 0) - ISNULL(SumSold, 0)) as difference 
FROM q1 LEFT JOIN q2 on q1.ItemName = q2.ItemName 

只是一切粘成一個單一的交易,也更好地優化執行計劃,我會建議使用CTE

;WITH q1 AS (
    SELECT ItemName, SUM(bought) as SumBought 
    FROM tBought GROUP BY ItemName), 
q2 AS (
    SELECT ItemName, SUM(sold) as SumSold 
    FROM tSold GROUP BY ItemName) 
SELECT q1.ItemName, 
     (ISNULL(SumBought, 0) - ISNULL(SumSold, 0)) as difference 
FROM q1 LEFT JOIN q2 on q1.ItemName = q2.ItemName 
相關問題