2013-04-16 67 views
0

我有一個股票視圖(列出所有單個股票和股票的日期)和一個銷售視圖(列出所有銷售和銷售日期發生)。SQL加入幫助 - 在加入之前總結和應用過濾器

庫存查看:

+----+------+-----+------------+ 
| ID | Item | Qty | Date | 
+----+------+-----+------------+ 
| 1 | A | 3 | 01/01/2000 | 
| 2 | A | 2 | 02/02/2000 | 
| 3 | D | 9 | 05/06/2000 | 
| 4 | F | 22 | 09/01/2001 | 
| 5 | A | 10 | 01/04/2001 | 
| 6 | C | 12 | 01/01/2002 | 
+----+------+-----+------------+ 

銷售視圖:需要

庫存觀看2日之間進行篩選:

+------+-----+------------+ 
| Item | Qty | Date | 
+------+-----+------------+ 
| B | 3 | 01/01/2001 | 
| B | 77 | 01/12/2001 | 
| C | 9 | 02/02/2002 | 
| A | 10 | 03/03/2002 | 
| G | 2 | 05/06/2002 | 
| C | 3 | 09/10/2012 | 
+------+-----+------------+ 

我想這樣做之前加入這些tables..but參數@StockFrom和@StockTo

銷售視圖需要在2日期之間過濾銷售額@SalesFrom和@SalesTo

然後,銷售視圖需要按項目進行分組,並具有總計數量(因此日期字段需要被刪除(雖然它正在過濾),然後加入到項目上的庫存視圖領域。

所以實質上我希望看​​到原樣的庫存視圖(但是按照日期過濾),並在附加列中顯示該項目的兩個日期之間發生的銷售額。

所需的輸出:

+----+------+-----+------------+-------+ 
| ID | Item | Qty | Date | Sales | 
+----+------+-----+------------+-------+ 
| 1 | A | 3 | 01/01/2000 | 10 | 
| 2 | A | 2 | 02/02/2000 | 10 | 
| 3 | D | 9 | 05/06/2000 |  0 | 
| 4 | F | 22 | 09/01/2001 |  0 | 
| 5 | A | 10 | 01/04/2001 | 10 | 
| 6 | C | 12 | 01/01/2002 | 12 | 
+----+------+-----+------------+-------+ 

感謝所有幫助提前!

+0

什麼是你'Date'的類型字段? – Nalaka526

+2

在問這裏之前,你真的應該自己嘗試一些東西(或者如果你嘗試過某些東西,展示它)。 [so]不是查詢寫作服務。 – Dukeling

+0

哪一個是您的數據庫? MS SQL服務器或MySql或Oracle或...? – TechDo

回答

0
SELECT 
    Stock.*, 
    IFNULL(SUM(Sales.Qty),0) AS Sales 
FROM Stock 
LEFT JOIN Sales ON Stock.Item=Sales.Item 
WHERE Stock.Date BETWEEN @StockFrom AND @StockTo 
AND (
    Sales.Date BETWEEN @SalesFrom AND @SalesTo 
    OR Sales.Date IS NULL 
) 
GROUP BY Stock.ID 

這是針對MySQL的,因爲您沒有指定diaclect。 SQLfiddle

編輯

SELECT 
    Stock.ID AS ID, 
    MIN(Stock.Item) AS Item, 
    MIN(Stock.Qty) AS Qty, 
    MIN(Stock.Date) AS Date, 
    CASE WHEN SUM(Sales.Qty) IS NULL THEN 0 ELSE SUM(Sales.Qty) END AS Sales 
FROM Stock 
LEFT JOIN Sales ON Stock.Item=Sales.Item 
WHERE Stock.Date BETWEEN @StockFrom AND @StockTo 
AND (
    Sales.Date BETWEEN @SalesFrom AND @SalesTo 
    OR Sales.Date IS NULL 
) 
GROUP BY Stock.ID 

作品MS SQL(SQLfiddle

+0

感謝您的Eugen,我們能不能在加入前過濾和總結銷售額,我擔心效率,因爲兩個表格都會包含很多行。 編輯:所以銷售表將有效地有1行每個項目顯示在加入股票表之前的一段時間的總銷售額。 –

+1

@TomJenkin我們在過濾之前查看錶格 - 查看執行計劃。 –

+0

我剛剛實現了這個查詢,它似乎工作得很好!謝謝 :) –

0

請嘗試以下查詢MS SQL Server的:

SELECT DISTINCT 
    a.ID, 
    a.Item, 
    a.Qty, 
    a.Date, 
    ISNULL(SUM(b.Qty) OVER (PARTITION BY a.Item, a.[Date]), 0) Sales 
FROM 
    StockView a LEFT JOIN SalesView b on a.Item=b.Item