我目前对这个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 |
=========================================================
因此,目标是查询所有项目详细信息以及今天未通过的所有保留项目的总和。这将是表格形式的目标:
[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 :(得分: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
答案 1 :(得分:1)
以下是我要做的事情:
您可以在一位查询中执行此操作,但我认为您会发现这对于可读性和查询构造的简易性更有效。
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;
答案 2 :(得分: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]
答案 3 :(得分: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]
答案 4 :(得分: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 = today&lt;约会