2016-01-13 104 views
1

我有一個稱爲項目表的表。SQL查詢選擇和組條件

樣內容:

order   product plan qty price term base_price 
CO0300039921 ZZFEE0000 N 1 0.01 1  25 
CO0300039921 ZZFEE0000 N 1 0.01 1  37.13 
CO0300039921 ZZFEE0000 N 1 0.02 1  37.13 
CO0300039921 ZZFEE0000 Y 1 0  1  1 
CO0300039921 ZZFEE0000 Y 1 0  1  1 
AO1000301407 VOSVC0002W0 Y 1 0  1  3 
AO1000301407 VOACT0101 N 1 0  2  5.99 


If plan is ‘N’ Then 
    get SUM(qty) AS 'quantity' 
    get price AS 'rate' 
If plan is ‘Y’ Then 
    get SUM(qty) AS 'quantity' 
    get (term * qty) AS 'rate' 
    get (base_price) AS 'base' 

FROM item 
WHERE order = 'CO0300039921' 
GROUP BY product, price, base_price 

預期的結果:

order   product plan qty price rate base_price 
    CO0300039921 ZZFEE0000 N 2 0.01 0.01  - 
    CO0300039921 ZZFEE0000 N 1 0.02 1  - 
    CO0300039921 ZZFEE0000 Y 2 -  1  1 

這裏是我試過:

SELECT CASE WHEN p8_plus_plan = 'Y' THEN 
( 

    SUM(qty_ordered), 
    (p8_contract_term*qty_ordered) AS 'rate', 
    product_base_price 
) 
ELSE 
( 
    SUM(qty_ordered), 
    price AS 'rate' 
) 
END 
FROM ns_order_line 
WHERE order_no = ? 
GROUP BY product_id, price, p8_plus_plan, product_base_price, order_no; 

,但我有一個錯誤。請幫忙。

+0

爲什麼你有這麼多的數據庫標記? –

+0

您可以使用SELECT開始查詢並使用CASE WHEN ... THEN ... ELSE ... – HubertL

+0

請編輯您的問題並顯示您想要的結果。 –

回答

1

你會這樣做使用條件聚合。這樣的事情:

select sum(case when plan = 'N' then qty end) as N_qty, 
     sum(case when plan = 'N' then price end) as N_rate, 
     sum(case when plan = 'Y' then qty end) as Y_qty, 
     sum(case when plan = 'Y' then term*qty end) as Y_rate, 
     sum(case when plan = 'Y' then base_price end) as Y_base 
from item 
where order = 'CO0300039921' 
group by product; 

我不確定你真的想要聚合。但關鍵點在於聚合函數中的case

+0

我添加了預期結果 – newbie

1

這是我想象的東西。

SELECT 
     `order` 
    , `product` 
    , `plan` 
    , CASE WHEN `plan` = 'Y' THEN base_price END AS base /* edit due to comment */ 
    , SUM(qty) AS qty 
    , MAX(price) AS price 
    , SUM(CASE WHEN `plan` = 'N' THEN price 
       WHEN `plan` = 'Y' THEN (term * qty) END) AS rate 
FROM item 
WHERE `order` = 'CO0300039921' 
GROUP BY 
     `order` 
    , `product` 
    , `plan` 
    , CASE WHEN `plan` = 'Y' THEN base_price END 

btw:列名「order」不是一個好的選擇,因爲它是一個保留字,也經常使用。引用該列時需要使用反引號。

可以使用不帶集合函數的CASE EXPRESSION,但該case表達式必須*也是GROUP BY子句的一部分。

*在MySQL(only)中,您可以繞過這個,因爲MySQL有一個不尋常的「擴展」來按語法分組,但這可以通過服務器設置進行更改,並且依賴於該擴展是有風險的。我強烈建議您將所有列(包括表達式)包含在不使用聚合函數(總和/計數/平均值等)的group by子句中。

+0

base_price不應該是一個總和......我可以有一個沒有總和的情況嗎? – newbie

+0

是的,你可以,我對該評論做出了修改 –