0

我有三个表,一个称为 orders(仅包含客户信息),另一个称为 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;

我将如何实施例外以忽略包含项目 X 的​​订单?

4

2 回答 2

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
于 2013-05-02T17:01:33.620 回答
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;
于 2013-05-02T17:01:19.537 回答