2016-05-03 14 views
1

Рассмотрим следующую таблицу:Как добиться следующего результата с помощью группы By в MySql?

+------------+-----------+-------------+---------+------------+--------+-------------+ 
    | 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_id и TradeDate. Таким образом, окончательный набор данных будет содержать каждую строку для каждой пары <client-id, TradeDate>. Я хочу, чтобы вычислить следующие особенности этих данных:

  1. Для каждого типа сегмента в каждой паре, я хочу, чтобы вычислить сумму заказов и OrderAmount

  2. Аналогично, для каждого типа OrdChannel в каждом пара, я хочу, чтобы вычислить сумму заказов и OrderAmount

  3. Наконец, подсчет каждого servicetype т.е. Type_1 и Type_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

Вы можете сделать с большим количеством суммы (СЛУЧАЙ .... END)

это suggestionfor колонна флиртует

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-when, но получал синтаксическую ошибку. – 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 

И повторите процесс для каждой суммы, в которой вы нуждаетесь.

Смежные вопросы