簡體   English   中英

MySQL:如果另一個表包含某個值,則在求和字段時忽略行

[英]MySQL: Ignore row when summing a field if another table contains a certain value

我有三個表,一個稱為訂單(僅包含客戶信息),另一個稱為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的訂單?

您可以簡單地從原始查詢中排除所有通過子選擇標識的訂單:

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

加入主查詢的子查詢將選擇包含項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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM