如何在 SELECT 子句中使用子查询?

How to use subquery in SELECT clause?

我的数据库中有两个 table main_item_stock 和 stock_history

我想创建一个报告来显示 main_item_stock 中每个项目的进货量、出货量和损耗量,对于用户执行的每个操作都会将记录插入 stock_history。

main_item_stock
-----------------------------------------------
stkitm_id  stkitm_code  stkitm_name  stkitm_qty
-----------------------------------------------
    1        S001         Apple        10.000
    2        S002         Orange        5.000
-----------------------------------------------


stock_history
-------------------------------------------------------------------------------------
stkhis_id  sktitm_id  stkitm_code  stkitm_name  stkhis_type  stkhis_qty  created_date
    1          1         S001         Apple       Wastage      1.000     2017/03/13
    2          2         S002        Orange      Stock Out     0.500     2017/03/12
    3          2         S002        Orange      Stock In      0.100     2017/03/13
-------------------------------------------------------------------------------------

我想要的结果:-

----------------------------------------------------------------------------------------------
stkitm_code  stkitm_name  created_date  item_onhand  item_stockin  item_stockout  item_wastage
----------------------------------------------------------------------------------------------
   S001      Apple        2017/03/13    9.000        0             0              1
   S002      Orange       2017/03/12    4.500        0             0.500          0
   S002      Orange       2017/03/13    4.600        0.100         0              0

*item_onhand = main_item_stock.stkitm_qty

我尝试了以下查询,但进货、缺货、浪费总是 return 相同的值

query = "SELECT main_item_stock.stkitm_code,main_item_stock.stkitm_name,main_item_stock.stkitm_qty,
                    (SELECT SUM(stkhis_qty) FROM stock_history WHERE stkhis_type = 'Stock Out'"

            If dtp_from.Checked Then
                query &= " AND DATE(stock_history.created_date) >= '" & Format(CDate(dtp_from.Text), "yyyy-MM-dd") & "'
                           AND DATE(stock_history.created_date) <= '" & Format(CDate(dtp_to.Text), "yyyy-MM-dd") & "'"
            End If

            query &= ") AS 'item_stockout',
                     (SELECT SUM(stkhis_qty) FROM stock_history WHERE stkhis_type = 'Wastage'"

            If dtp_from.Checked Then
                query &= " AND DATE(stock_history.created_date) >= '" & Format(CDate(dtp_from.Text), "yyyy-MM-dd") & "'
                           AND DATE(stock_history.created_date) <= '" & Format(CDate(dtp_to.Text), "yyyy-MM-dd") & "'"
            End If

            query &= ") AS 'item_wastage',
                     (SELECT SUM(stkhis_qty) FROM stock_history WHERE stkhis_type = 'Stock In'"

            If dtp_from.Checked Then
                query &= " AND DATE(stock_history.created_date) >= '" & Format(CDate(dtp_from.Text), "yyyy-MM-dd") & "'
                           AND DATE(stock_history.created_date) <= '" & Format(CDate(dtp_to.Text), "yyyy-MM-dd") & "'"
            End If

            query &= ") AS 'item_stockin'
                    FROM main_item_stock
                    LEFT JOIN stock_history
                    ON main_item_stock.stkitm_id = stock_history.stkitm_id"

            query &= " GROUP BY stock_history.stkitm_id"

如何更改查询并获得我想要的结果?

更新:

我尝试了另一个查询,这次 return 数据是正确的,但是我可以使用这个 table 来创建我想要的报告吗?

SELECT SUM(stkhis_qty),stkitm_name,stkhis_type,DATE(created_date)
FROM stock_history
WHERE DATE(created_date) >= '2017/03/12'
GROUP BY stkitm_code,stkhis_type,DATE(created_date)

结果:-

如何将 image1 table 更改为 image2?报告需要包含所有这些列

更新:

这是main_item_stock

这是stock_history

结果应该如下图所示,两种类型都可以。

*图片最后记录日期错误应该是3/17/2017

这应该让你很接近...

*已编辑以反映手头物品的变化,而不是当前手头物品总数。

SELECT
sh.stkitm_code,
sh.stkitm_name,
SUM(IF(stkhis_type = 'Stock In', 
    sh.stkhis_qty, 
    -1 * sh.stkhis_qty))               AS change_of_item_onhand,
SUM(IF(stkhis_type = 'Stock In', 
    sh.stkhis_qty, 
    0))                                AS item_stockin,
SUM(IF(stkhis_type = 'Stock Out', 
    sh.stkhis_qty, 
    0))                                AS item_stockout,
SUM(IF(stkhis_type = 'Wastage', 
    sh.stkhis_qty, 
    0))                                AS item_wastage,
sh.created_date
FROM stock_history sh
LEFT JOIN main_item_stock mis ON mis.stkitm_code = sh.stkitm_code
WHERE sh.created_date > "<Oldest date>" 
AND sh.created_date < "<Youngest date>" 
GROUP BY stkitm_code

这应该会产生如下所示的输出:

尽管您可能希望按 stkitm_code 和日期分组。

或者,删除 "SUM" 和 "GROUP BY" 将逐项列出,但 item_onhand 列不会累积(尽管可能有一种巧妙的方法来做到这一点)

SELECT
sh.stkitm_code,
sh.stkitm_name,
IF(stkhis_type = 'Wastage' OR 
    stkhis_type = 'Stock Out', 
    mis.stkitm_qty - sh.stkhis_qty, 
    mis.stkitm_qty + sh.stkhis_qty)   AS item_onhand,
IF(stkhis_type = 'Stock In', 
    sh.stkhis_qty, 
    0)                                AS item_stockin,
IF(stkhis_type = 'Stock Out', 
    sh.stkhis_qty, 
    0)                                AS item_stockout,
IF(stkhis_type = 'Wastage', 
    sh.stkhis_qty, 
    0)                                AS item_wastage,
sh.created_date
FROM stock_history sh
LEFT JOIN main_item_stock mis ON mis.stkitm_code = sh.stkitm_code
WHERE sh.created_date > "<Oldest date>" 
AND sh.created_date < "<Youngest date>" 

最终看起来像这样:

希望对您有所帮助!