2015-05-22 26 views
3

我目前很困擾我的項目在這個SQL查詢,我無法去工作。插入一個有點複雜的SQL查詢

這裏是我的表:

[INVENTORY] 
==================================================== 
| ITEM _ID | ITEM_DESC | STOCK | PPU | 
==================================================== 
| 1   | CHAIR WHITE |  200 | 15.00 | 
| 2   | CHAIR BLACK |  150 | 15.00 | 
| 3   | CHAIR GREEN |  100 | 15.00 | 
==================================================== 

[I_RSV] 
============================================== 
| ID | TRAN_CODE | ITEM_ID | QTY | 
============================================== 
| 1 | 1001  |  1  | 100 | 
| 2 | 1001  |  2  |  50 | 
| 3 | 1002  |  1  |  50 | 
============================================== 

[TRANSACTIONS] 
========================================================= 
| TRAN_CODE | TRAN_DATE | DATE_IN | DATE OUT | 
========================================================= 
| 1001  | 5/22/2015 | 5/26/2015 | 5/27/2015 | 
| 1002  | 5/22/2015 | 5/30/2015 | 5/31/2015 | 
========================================================= 

所以我們的目標是查詢所有項目的細節和SUM預留的所有項沒有通過今天的日期。這將是表格形式的目標:

[TABLE X] 
============================================================= 
| ITEM_ID | ITEM_DESC | PPU | STOCK | RESERVED | 
============================================================= 
| 1  | CHAIR WHITE | 15.00 |  200 |  150 | 
| 2  | CHAIR BLACK | 15.00 |  150 |  50 | 
| 3  | CHAIR GREEN | 15.00 |  100 |   0 | 
============================================================= 

到目前爲止,這是我做了什麼:

SELECT ITEM_ID, ITEM_DESC, PPU, STOCK, (SELECT SUM(QTY) FROM I_RSV WHERE 
DATE_OUT < GETDATE() GROUP BY ITEM_ID) FROM INVENTORY 

但我似乎無法得到它的工作。任何幫助,將不勝感激。

+0

'GETDATE()'是SQL Server(和我認爲的sybase)。我將標記此SQL Server –

回答

1

這裏是我會做什麼:

  1. 獨立的兩個查詢。
  2. 將您的選擇邏輯放入內聯查詢中並對結果進行求和。
  3. 左連接這兩個,這樣你仍然可以看到沒有任何匹配保留的產品。

你可以在一位查詢中做到這一點,但我認爲你會發現這個工作更好的可讀性和易於查詢構建。

Create table #INVENTORY (Item_ID int,Item_Desc varchar(50),Stock Int,PPU real); 
Insert Into #INVENTORY values 
(1,'CHAIR WHITE',200,15.00) 
,(2,'CHAIR BLACK',150,15.00) 
,(3,'CHAIR GREEN',100,15.00) 

Create Table #I_RSV (ID Int,Tran_Code int,Item_ID int,Qty Int) 
Insert into #I_RSV values 
(1,1001,1,100),(2,1001,2,50),(3,1002,1,50) 

Create Table #TRANSACTIONS 
(TRAN_CODE int,TRAN_DATE date, DATE_IN date, [DATE OUT] date) 
Insert into #TRANSACTIONS Values 
(1001,'5/20/2015','5/20/2015','5/20/2015') 
,(1002,'5/22/2015','5/30/2015','5/31/2015') 

Select I.*,Case when R.Qty is null then 0 else R.Qty end as Reserved 
from #INVENTORY as I 
Left join 
    ( select SUM(Qty) as Qty ,R.Item_ID 
     from #I_RSV as R inner join #TRANSACTIONS as T 
     on R.Tran_Code=T.TRAN_CODE 
     Where T.[DATE OUT] < GETDATE() 
     group by R.Item_ID) as R 
    on R.Item_ID=I.Item_ID; 

drop table #INVENTORY; 
drop table #TRANSACTIONS; 
drop table #I_RSV; 
+0

不要忘記,獲取日期還包括時間,所以如果您使用日期時間字段,則需要稍微調整查詢以解決該差異。 – Middletone

+0

這工作!非常感謝。 – Chuck

1

你需要三個表連接在一起,以便查詢的功能

SELECT INV.ITEM_ID, INV.ITEM_DESC, INV.PPU, INV.STOCK, SUM(I_RSV.QTY) 
FROM INVENTORY INV 
    JOIN I_RSV ON I_RSV.ITEM_ID = INVENTORY.ITEM_ID 
    JOIN TRANSACTIONS TRN ON I_RSV.TRAN_CODE = TRN.TRAN_CODE 
WHERE TRN.TRAN_CODE.DATE_OUT < GETDATE() 
GROUP BY INV.ITEM_ID 
+0

當您嘗試執行此查詢時,它會給出錯誤。 – Rigel1121

0

使用INNER JOIN。見下面我的查詢:

SELECT 
     ITEM_ID, 
     ITEM_DESC, 
     PPU, 
     STOCK, 
     SUM(QTY)[RESERVED] 
FROM INVENTORY A 
LEFT JOIN I_RSV B ON A.ITEM_ID=B.ITEM_ID 
LEFT JOIN TRANSACTIONS C ON B.TRAN_CODE=C.TRAN_CODE 
WHERE DATE_OUT < GETDATE() 
GROUP BY ITEM_ID,ITEM_DESC,PPU,STOCK,[DATE OUT] 
+0

它可以工作,但它將如何返回當前未保留的記錄。 (見編輯) – Chuck

+0

請參閱@ Chris'o的答案。 – Rigel1121

+0

我的意思是,它將如何返回庫存中的所有行,我與其他連接嘗試此操作,但它只返回具有保留記錄的項目。 – Chuck

0

加成@ Rigel1121回答

SELECT 
     ITEM_ID, 
     ITEM_DESC, 
     PPU, 
     STOCK, 
     SUM(QTY), 
     STOCK - SUM(QTY) 'FREE TO RESERVE' --free from reservation qty 
FROM INVENTORY A 
INNER JOIN I_RSV B ON A.ITEM_ID=B.ITEM_ID 
INNER JOIN TRANSACTIONS C ON B.TRAN_CODE=C.TRAN_CODE 
WHERE DATE_OUT < GETDATE() 
GROUP BY ITEM_ID,ITEM_DESC,PPU,STOCK,[DATE OUT] 
0

試試這個:

SELECT INVENTORY.ITEM_ID, INVENTORY.ITEM_DESC, INVENTORY.STOCK, INVENTORY.PPU, SUM(I_RSV.QTY) 
    FROM INVENTORY 
    LEFT JOIN I_RSV 
    ON INVENTORY.ITEM_ID = I_RSV.ITEM_ID 
    LEFT JOIN TRANSACTION 
    ON TRANSACTION.TRAN_CODE = I_RSV.TRAN_CODE 
    WHERE TRANSACTION.DATE_OUT > GETDATE() 
    GROUP BY INVENTORY.ITEM_ID, INVENTORY.ITEM_DESC, INVENTORY.STOCK, INVENTORY.PPU 

您的DATE_OUT < GETDATE()是錯誤的。你不應該在今天通過日期,你應該date_out> getdate()。或者你應該把它作爲GETDATE() < DATE_OUT GETDATE =今天<日期出來