2014-09-02 113 views
0

我有以下MySQL查詢MYSQL UNION - 產生意外結果

MYSQL

SELECT SUM(shop_order_price), p.category 
from shop_orders so 
INNER JOIN product p 
on so.shop_order_product_id=p.product_id 
WHERE so.shop_order_action = 'Sale' 
AND so.brand = '53' 
AND p.category = 'Mens' 
AND so.shop_order_location = 'Bawtry' 
AND so.shop_order_month = '05' AND so.shop_order_year = '2014' 

UNION ALL 

    SELECT SUM(shop_order_price), p.category 
    from shop_orders so 
    INNER JOIN product p 
    on so.shop_order_product_id=p.product_id 
    WHERE so.shop_order_action = 'Sale' 
    AND so.brand = '53' 
    AND p.category= 'Ladies' 
    AND so.shop_order_location = 'Bawtry' 
    AND so.shop_order_month = '05' AND so.shop_order_year = '2014' 

    UNION ALL 

    SELECT SUM(shop_order_price), p.category 
    from shop_orders so 
    INNER JOIN product p 
    on so.shop_order_product_id=p.product_id 
    WHERE so.shop_order_action = 'Sale' 
    AND so.brand = '53' 
    AND so.shop_order_location = 'Bawtry' 
    AND so.shop_order_month = '05' AND so.shop_order_year = '2014' 

將會產生以下結果:

結果

SUM(shop_order_price)  category 
--------------------   --------- 

282.5       Mens 
751       Ladies 
1033.5      Ladies 

SUM數字是正確的,但是,底部的行在類別列中顯示'Ladies',即使在查詢中沒有指定類別。

我的問題是我可以得到這最後一行顯示TOTAL,而不是Ladies?所以如下結果會出現:

預期結果

SUM(shop_order_price)  category 
    --------------------   --------- 

    282.5       Mens 
    751       Ladies 
    1033.5      TOTAL 

任何意見將是巨大的。

回答

1

您可以使用GROUP BYWITH ROLLUP修改,簡化您的查詢:

SELECT SUM(shop_order_price), p.category 
FROM shop_orders so 
    INNER JOIN product p 
    ON so.shop_order_product_id = p.product_id 
WHERE so.shop_order_action = 'Sale' 
    AND so.brand = '53' 
    AND p.category IN ('Mens', 'Ladies') 
    AND so.shop_order_location = 'Bawtry' 
    AND so.shop_order_month = '05' 
    AND so.shop_order_year = '2014' 
GROUP BY p.category 
    WITH ROLLUP ; 

如果你想不顯示NULL'TOTAL',這個最好是在應用程序方面。你可以在SQL中做到這一點,將查詢包裝在一個派生表中 - 但我不會使用它:

SELECT 
    sum_order_price, 
    COALESCE(category, 'TOTAL') AS category 
FROM 
    (SELECT SUM(shop_order_price) AS sum_order_price, 
      p.category 
    FROM shop_orders so 
     INNER JOIN product p 
     ON so.shop_order_product_id = p.product_id 
    WHERE so.shop_order_action = 'Sale' 
     AND so.brand = '53' 
     AND p.category IN ('Mens', 'Ladies') 
     AND so.shop_order_location = 'Bawtry' 
     AND so.shop_order_month = '05' 
     AND so.shop_order_year = '2014' 
    GROUP BY p.category 
     WITH ROLLUP 
) AS dt ; 
+0

這是更加優化 - 謝謝。無論如何要在最後一行顯示'TOTAL'而不是_NULL_? – aphextwix 2014-09-02 13:20:07

+0

你可以把查詢放在派生表中,我會更新。 – 2014-09-02 13:33:00

+0

感謝您的更新答案 - 您是否介意解釋爲什麼您不會使用它的原因? – aphextwix 2014-09-02 13:48:24

2

這不是一個優雅的解決方案,但你可以試試這個。它沒有給它賦一個列值,而是在其中硬編碼了'TOTAL',我認爲這應該會導致你在追求什麼。

MYSQL

SELECT SUM(shop_order_price), p.category 
from shop_orders so 
INNER JOIN product p 
on so.shop_order_product_id=p.product_id 
WHERE so.shop_order_action = 'Sale' 
AND so.brand = '53' 
AND p.category = 'Mens' 
AND so.shop_order_location = 'Bawtry' 
AND so.shop_order_month = '05' AND so.shop_order_year = '2014' 

UNION ALL 

    SELECT SUM(shop_order_price), p.category 
    from shop_orders so 
    INNER JOIN product p 
    on so.shop_order_product_id=p.product_id 
    WHERE so.shop_order_action = 'Sale' 
    AND so.brand = '53' 
    AND p.category= 'Ladies' 
    AND so.shop_order_location = 'Bawtry' 
    AND so.shop_order_month = '05' AND so.shop_order_year = '2014' 

    UNION ALL 

    SELECT SUM(shop_order_price), 'Total' 
    from shop_orders so 
    INNER JOIN product p 
    on so.shop_order_product_id=p.product_id 
    WHERE so.shop_order_action = 'Sale' 
    AND so.brand = '53' 
    AND so.shop_order_location = 'Bawtry' 
    AND so.shop_order_month = '05' AND so.shop_order_year = '2014'