陷入一些有点复杂的SQL查询

时间:2015-05-22 03:15:50

标签: sql sql-server

我目前对这个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

但我似乎无法让它发挥作用。任何帮助都会受到如此多的赞赏。

5 个答案:

答案 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)

以下是我要做的事情:

  1. 分开两个查询。
  2. 将您的选择逻辑放入内联查询并对结果求和。
  3. 左边加入两个,这样你仍然可以看到没有任何匹配预订的产品。
  4. 您可以在一位查询中执行此操作,但我认为您会发现这对于可读性和查询构造的简易性更有效。

    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;约会

相关问题