Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Pivot-ähnliche Operation, um eine Aufschlüsselung des Prozentsatzes aller Ereignisse pro Tag und Ereignistyp zu erhalten

Sie fragen nach dynamischem SQL. Das heißt, die Abfragezeichenfolge dynamisch aus einer anderen Abfrage erstellen, die unterschiedliche event_type auflistet Werte, dann führen Sie es aus. In MySQL wird dies durch vorbereitete Anweisungen implementiert.

So geht's:

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; 

Für Ihre Beispieldaten ergibt dies die folgende Abfrage:

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

Und das folgende Ergebnis:

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

Demo auf DB Fiddle