【问题标题】:Join 3 Table Sum Group By MySQL PHP通过 MySQL PHP 加入 3 表总和组
【发布时间】:2021-07-25 17:27:52
【问题描述】:

我正在使用 Codeigniter,我想要 sum(stock_in) 和 sum(stock_out) 并按 id_barang 分组:

桌子库存

code name stock
B01 Book 40

餐桌库存

code name stock in
B01 Book 20
B01 Book 10

餐桌缺货

code name stock out
B01 Book 5
B01 Book 10

我想要结果: 总结

code name stock stock in stock out last stock
B01 Book 40 30 15 55

最后库存 = (库存 + 进货) - 缺货

我可以加入 3 个表,但 sum(stock_in) 和 sum(stock_out) 是这样的:

code name stock stock in stock out last stock
B01 Book 40 60 30 70

【问题讨论】:

  • 在加入前对表进行分组和求和,根本不需要两个表
  • 您可能会发现拥有单个事务表更简单
  • 嗨@median:你得到想要的结果了吗?如果没有,请在下面查看我的答案。

标签: php mysql codeigniter


【解决方案1】:

这是一种方法(使用 RahulBiswas 精心提供的小提琴)...

SELECT s.code   
     , s.name
     , s.stock
     , SUM(CASE WHEN direction = 'in' THEN qty END) stock_in
     , SUM(CASE WHEN direction = 'out' THEN qty END) stock_out
     , s.stock+SUM(CASE WHEN direction = 'in' THEN qty END)-SUM(CASE WHEN direction = 'out' THEN qty END) balance
  FROM stock s
  JOIN 
     ( SELECT code
            , name
            , stock_in qty
            , 'in' direction
         FROM stock_in
        UNION ALL
       SELECT code
            , name
            , stock_out 
            , 'out' 
         FROM stock_out
    ) x
   ON x.code = s.code;
   

http://sqlfiddle.com/#!9/6dc765/10

【讨论】:

    【解决方案2】:

    根据您想要的输出,此处使用 INNER JOIN。但如果代码 (B01) 在 stock_in 和 Stock_out 表中不存在,则使用 LEFT JOIN 而不是 INNER JOIN。金额字段中使用 COALESCE 函数忽略 NULL。

    -- MySQL
    SELECT s.code, s.name, s.stock, si.stock_in, so.stock_out
         , (s.stock + si.stock_in - so.stock_out) last_stock
    FROM Stock s
    INNER JOIN (SELECT code, MAX(name) name
                     , SUM(stock_in) stock_in
                FROM Stock_in
                GROUP BY code) si
            ON s.code = si.code
    INNER JOIN (SELECT code, MAX(name) name
                     , SUM(stock_out) stock_out
                FROM Stock_out             
                GROUP BY code) so
                ON s.code = so.code;
    

    请检查来自 url http://sqlfiddle.com/#!9/6dc765/4的结果

    请检查使用左连接的结果http://sqlfiddle.com/#!9/9e97ef3/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多