2016-05-03 49 views
1

考慮下表:如何在MySql中使用Group By實現以下結果?

+------------+-----------+-------------+---------+------------+--------+-------------+ 
    | client_id | TradeDate | servicetype | SEGMENT | OrdChannel | orders | OrderAmount | 
    +------------+-----------+-------------+---------+------------+--------+-------------+ 
    |  1  | 20140611 | Type_1  | CASH | TT   |  1 |  39275 | 
    |  2  | 20150119 | Type_1  | CASH | DNT  |  2 |  11856.9 | 
    |  3  | 20150922 | Type_1  | FNO  | OTHER  |  1 |  854750 | 
    |  4  | 20151223 | Type_1  | CASH | TT   |  5 |  71075 | 
    |  5  | 20140529 | Type_1  | Offline | FNO  |  1 |   0 | 
    |  6  | 20160310 | Type_2  | CASH | WEB  |  2 |  8009.6 | 
    |  7  | 20150318 | Type_1  | Offline | FNO  |  2 |  432900 | 
    |  8  | 20150914 | Type_2  | CASH | WEB  |  2 |  15612 | 
    |  9  | 20160317 | Type_2  | FNO  | MINI  |  1 |  9000 | 
    |  10 | 20140421 | Type_1  | CASH | TT   |  8 |  17112.5 | 
    +------------+-----------+-------------+---------+------------+--------+-------------+ 

我被client_idTradeDate想這組數據。因此最終數據集將包含每對<client-id, TradeDate>的每一行。 我想計算從該數據如下特點:

  1. 對於每對中的每個類型的段,我想計算定單的總和和OrderAmount

  2. 類似地,對於每一個各類型OrdChannel的對,我想計算訂單總數和OrderAmount

  3. 最後,每個servicetype的計數即Type_1Type_2

因此最終的數據集將包含如下圖所示類似列:​​

+------------+-----------+-------------+---------+------------+--------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+ 
    | client_id | TradeDate | SEGMENT_CASH_orders_sum | SEGMENT_CASH_OrderAmount_sum.... | OrdChannel_TT_orders_sum | OrdChannel_TT_OrderAmount_sum.... | servicetype_Type_1_count | servicetype_Type_2_count | 
    +------------+-----------+-------------+---------+------------+--------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+ 

到目前爲止,我曾嘗試:

select clientsrno, TradeDate, SEGMENT, COUNT(orders) from orders group by clientsrno, TradeDate, SEGMENT; 

,但它不是給單獨列SEGMENT_CASH-orders_sum等。

取而代之的輸出是:

+------------+-----------+---------+---------------+ 
    | clientsrno | TradeDate | SEGMENT | COUNT(orders) | 
    +------------+-----------+---------+---------------+ 
    |   44 | 20141209 | CASH |   23 | 
    |   44 | 20141211 | FNO  |   10 | 
    +------------+-----------+---------+---------------+ 
+0

爲什麼不提供想要的結果? – Strawberry

回答

1

你可以有很多總和(CASE .... END)做

這是一個suggestionfor的firts列

select client_di, TradeDate 
    sum (case SEGMENT 
     when 'CASH' then orders ELSE 0 END) as SEGMENT_CASH_orders_sum, 
    sum (case SEGMENT 
     when 'CASH' then OrderAmount ELSE 0 END) as SEGMENT_CASH_ordersAmount_sum, 
    sum (case SEGMENT 
     when 'FNO' then orders ELSE 0 END) as SEGMENT_FNO_orders, 
    sum (case SEGMENT 
     when 'FNO' then OrderAmount ELSE 0 END) as SEGMENT_FNO_ordersAmount_sum 
from my_table 
group by client_id, TradeDate 
+0

嗨@scaisEdge,我嘗試了sum-case的各種版本,但得到一個語法錯誤。 – Sangram

+0

對不起太多= ..我已經更新了答案 – scaisEdge

+0

似乎我們也可以用=來寫。其實我們錯過了TradeDate之後的逗號(,)! :D非常感謝您的幫助。 – Sangram

0

比如,你可以這樣做:

SELECT clientsrno, TradeDate, SEGMENT, COUNT(orders), sumOrders.total FROM tabletest 
INNER JOIN (
    SELECT tabletest.tradeDate, SUM(orders) as total FROM tabletest 
    GROUP BY clientsrno, TradeDate, SEGMENT 
) sumOrders ON tableTest.tradeDate = sumOrders.tradeDate 
GROUP BY clientsrno, TradeDate, SEGMENT 

然後重複你需要的每一筆款項的處理。