sql >> データベース >  >> RDS >> Mysql

イベントタイプごとの1日あたりの合計イベントの割合の内訳を取得するMySQLピボットのような操作

    あなたは動的SQLを求めています。つまり、個別のevent_typeをリストする別のクエリからクエリ文字列を動的に構築します 値を実行してから実行します。 MySQLでは、これはプリペアドステートメントを使用して実装されます。

    方法は次のとおりです。

    select @sql := group_concat(distinct
        'sum(case when event_type = ''', 
        event_type, ''' then number else 0 end)/sum(number) as `ratio_', 
        event_type, '`'
    ) 
    from example_table;
    
    set @sql = concat(
        'select date(created_at) date_bucket, ', 
        @sql, 
        ' from example_table group by date(created_at) order by date_bucket'
    );
    
    -- debug
    select @sql;
    
    -- execute
    prepare stmt from @sql;
    execute stmt;
    deallocate prepare stmt; 
    

    サンプルデータの場合、これにより次のクエリが生成されます。

    select 
        date(created_at) date_bucket, 
        sum(case when event_type = 'exampleG1' then number else 0 end)/sum(number) as `ratio_exampleG1`,
        sum(case when event_type = 'exampleG2' then number else 0 end)/sum(number) as `ratio_exampleG2`,
        sum(case when event_type = 'exampleG3' then number else 0 end)/sum(number) as `ratio_exampleG3` 
    from example_table 
    group by date(created_at) 
    order by date_bucket
    

    そして次の結果:

    date_bucket | ratio_exampleG1 | ratio_exampleG2 | ratio_exampleG3
    :---------- | --------------: | --------------: | --------------:
    2020-06-02  |          0.1429 |          0.2857 |          0.5714
    2020-06-03  |          1.0000 |          0.0000 |          0.0000
    

    DBフィドルのデモ




    1. 1:nテーブルからの単一のクエリで最新のメモを(タイムスタンプで)取得する

    2. PHP / MySQLi:lc_time_namesとDATE_FORMAT()をmysqliクエリに設定しますか?

    3. MySQLでカーソルを使用する場合は、DECLAREステートメントからストアドプロシージャを呼び出します

    4. SSISがパッケージの保存に失敗し、VisualStudioを再起動します