2016-05-03 3 views
1

以下の表に考えてみましょう:私はclient_idTradeDateによってグループに、このデータをしようとしています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-id, TradeDate>ペアの各行が含まれます。 私は、このデータから、以下のような特徴を計算したい:すべての中OrdChannelの種類ごとに、同様に

  • を、私は注文の合計を計算したいすべてのペアのセグメントの種類ごとに

    1. とOrderAmount

      ペア、私は注文と注文合計を計算したい

    2. 最後に、それぞれservicetypeの数すなわちType_1Type_2の数。

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

      をしかし、それはなど、SEGMENT_CASH-orders_sumのための個別の列を与えていない:

      +------------+-----------+-------------+---------+------------+--------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+ 
          | 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 | 
          +------------+-----------+-------------+---------+------------+--------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+ 
      

      はこれまでのところ、私が試してみました:

    したがって、最終的なデータセットは以下のように類似の列が含まれます

    代わりに私が得る出力は:

    ですあなたが和の多く(CASE .... END)で行うことができます
    +------------+-----------+---------+---------------+ 
        | clientsrno | TradeDate | SEGMENT | COUNT(orders) | 
        +------------+-----------+---------+---------------+ 
        |   44 | 20141209 | CASH |   23 | 
        |   44 | 20141211 | FNO  |   10 | 
        +------------+-----------+---------+---------------+ 
    
  • +0

    希望の結果を得られないのはなぜですか? – Strawberry

    答えて

    1

    これはあなたが例のために何ができる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

    suggestionforです:

    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 
    

    必要な金額ごとにこの手順を繰り返します。

    関連する問題