我有三个表,一个称为订单(仅包含客户信息),另一个称为orders_total(包含订单小计,折扣和总计),最后一个称为orders_products(包含订购商品的名称和价格)。它们都被称为orders_id的公共字段绑定。
我正在尝试为包含项目X的订单(来自orders_products表)汇总(总和)总销售收入,但由于某种原因,当我引入第三个表格时,销售收入的总和没有正确累加( orders_products)。我知道如何使用三个表中的任意两个分别进行聚合和项异常,但我的复杂性是通过引入第三个表来组合这两个函数。到目前为止,这是我正常工作的查询,只有两个原始表:
SELECT o.orders_id, ot.orders_id, o.delivery_state, SUM(ot.revenue) AS ordersum
FROM orders_total ot, orders o
WHERE ot.orders_id = o.orders_id
GROUP BY o.delivery_state
ORDER BY ordersum DESC;
如何实现异常以忽略包含Item X的订单?
答案 0 :(得分:1)
您可以简单地从原始查询中排除通过子选择识别的任何订单:
SELECT o.orders_id, ot.orders_id, o.delivery_state, SUM(ot.revenue) AS ordersum
FROM orders_total ot
INNER JOIN orders o ON ot.orders_id = o.orders_id
WHERE ot.orders_id NOT IN (SELECT orders_id FROM orders_products WHERE product_name = '?')
GROUP BY o.delivery_state
ORDER BY ordersum DESC;
请注意,?
代表您要排除的product_name。
您也可能不希望orders_id
信息作为选择的一部分,因为这是关于此聚合的无意义数据。
要使此查询运行良好,请确保您具有索引:
orders_products.product_name
orders.delivery_date
orders.orders_id
orders_total.orders_id
答案 1 :(得分:0)
在主查询中加入一个子查询,该子查询选择包含项目X的订单,然后过滤掉SUM()
参数中没有的订单。
SELECT
o.orders_id,
ot.orders_id,
o.delivery_state,
SUM(CASE WHEN op.orders_id IS NULL THEN ot.revenue ELSE 0 END) AS ordersum
FROM orders_total ot
INNER JOIN orders o
ON ot.orders_id = o.orders_id
LEFT OUTER JOIN (
SELECT DISTINCT orders_id
FROM orders_products
WHERE ... -- Add your condition to select only item X
) op
ON op.orders_id = o.orders_id
GROUP BY o.delivery_state
ORDER BY ordersum DESC;