sql >> Database teknologi >  >> RDS >> Mysql

MySQL pivot-lignende operation for at få en opdeling af procentdelen af ​​de samlede hændelser pr. dag pr. begivenhedstype

Du beder om dynamisk SQL. Det vil sige, dynamisk opbygge forespørgselsstrengen fra en anden forespørgsel, der viser distinkt event_type værdier, og kør det derefter. I MySQL implementeres dette ved hjælp af forberedte udsagn.

Sådan gør du det:

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; 

For dine eksempeldata producerer dette følgende forespørgsel:

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

Og følgende resultat:

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 på DB Fiddle




  1. Generer en tilfældig streng i MySQL

  2. Sådan indsætter du en mikrosekund-præcision datetime i mysql?

  3. Kald til en medlemsfunktion rowCount() på et ikke-objekt

  4. Direkte adgang til en SQL Server-database i Xamarin.Forms