使用 group by 的两个查询之间的减法
subtraction between two queries with group by
我使用 MariaDB 并有两个表(订单,invoiced_positions),我需要计算每件商品的发票数量和付款数量。所以我需要计算行数并按 item_name 分组。这样做的问题是一些项目被重新打开:所以我需要从没有的发票中减去重新打开的发票数量。基本上:我想为 所有 项目做我在这里只为一个项目取得的成就:
SELECT
(SELECT COUNT(item_name = 'Streuselkuchen')
FROM orders, invoiced_positions
WHERE order_id = id AND reopened = 0)
- (SELECT COUNT(item_name = 'Streuselkuchen')
FROM orders, invoiced_positions
WHERE order_id = id AND reopened != 0) AS Difference;
我认为这可以通过如图所示的条件聚合来实现,但我无法将其应用到我的特定任务中。
您需要 table 的适当 JOIN
,GROUP BY item_name
,然后是条件聚合:
SELECT item_name, SUM(reopened = 0) - SUM(reopened != 0) AS Difference
FROM orders AS O INNER JOIN invoiced_positions AS IP
ON IP.order_id = O.id
GROUP BY item_name;
我没有用 table 别名限定 item_name
和 reopened
列,因为它们所属的位置并不明显,但您应该这样做。
我使用 MariaDB 并有两个表(订单,invoiced_positions),我需要计算每件商品的发票数量和付款数量。所以我需要计算行数并按 item_name 分组。这样做的问题是一些项目被重新打开:所以我需要从没有的发票中减去重新打开的发票数量。基本上:我想为 所有 项目做我在这里只为一个项目取得的成就:
SELECT
(SELECT COUNT(item_name = 'Streuselkuchen')
FROM orders, invoiced_positions
WHERE order_id = id AND reopened = 0)
- (SELECT COUNT(item_name = 'Streuselkuchen')
FROM orders, invoiced_positions
WHERE order_id = id AND reopened != 0) AS Difference;
我认为这可以通过如图所示的条件聚合来实现
您需要 table 的适当 JOIN
,GROUP BY item_name
,然后是条件聚合:
SELECT item_name, SUM(reopened = 0) - SUM(reopened != 0) AS Difference
FROM orders AS O INNER JOIN invoiced_positions AS IP
ON IP.order_id = O.id
GROUP BY item_name;
我没有用 table 别名限定 item_name
和 reopened
列,因为它们所属的位置并不明显,但您应该这样做。