繁体   English   中英

从另一个子查询中减去一个子查询,然后 GROUP BY "element_id"

[英]Substract one subquery from another and then GROUP BY "element_id"

我有这张表:

有这张桌子

我正在尝试使用以下查询获取所有“entrada”减去“product_id”的所有“salida”的总和:

SELECT((SELECT SUM(cantidad) FROM inventario WHERE registro = "entrada" GROUP by producto_id)
-(SELECT SUM(cantidad) FROM inventario WHERE registro = "salida" GROUP by producto_id))
FROM inventario GROUP by producto_id

这些子查询单独工作正常,但表示返回:#1242 - 子查询返回超过 1 行”

我做错了什么? 我必须进行 2 个单独的查询吗? 再三考虑,如果产品有“entrada”但没有“salida”怎么办?

您不需要为此使用子查询; 只需根据需要添加或减去:

select sum(case registro when 'salida' then -cantidad when 'entrada' then cantidad end)
from inventario
group by producto_id

怎么样让你开始 -

-- CTE to create dummy data
WITH inventario AS (
  (SELECT 1 AS id, 1 AS producto_id, 'salida' AS registro, 5 AS cantidad) UNION ALL
  (SELECT 2, 1, 'entrada', 15) UNION ALL
  (SELECT 3, 1, 'entrada', 18) UNION ALL
  (SELECT 4, 1, 'entrada', 18) UNION ALL
  (SELECT 5, 3, 'entrada', 14) UNION ALL
  (SELECT 6, 1, 'entrada', 18) UNION ALL
  (SELECT 7, 3, 'entrada', 14) UNION ALL
  (SELECT 8, 1, 'eliminar', 18) UNION ALL
  (SELECT 9, 3, 'salida', 14))
-- end CTE

SELECT
    producto_id,
    SUM(IF(registro = 'entrada', cantidad, 0)) AS `entrada`,
    SUM(IF(registro = 'salida', cantidad, 0)) AS `salida`,
    SUM(IF(registro = 'eliminar', cantidad, 0)) AS `eliminar`,
    SUM(CASE registro
            WHEN 'entrada' THEN cantidad
            WHEN 'salida' THEN -cantidad
            WHEN 'eliminar' THEN -cantidad
    END) AS `stock_held`
FROM inventario
GROUP BY producto_id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM