sql >> Databasteknik >  >> RDS >> Mysql

MySQL pivotliknande operation för att få en uppdelning av procentandelen av totala händelser per dag per händelsetyp

Du efterfrågar dynamisk SQL. Det vill säga, bygg frågesträngen dynamiskt från en annan fråga som listar distinkt event_type värden och kör det sedan. I MySQL implementeras detta med hjälp av förberedda satser.

Så här gör du:

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 dina exempeldata ger detta följande fråga:

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

Och följande 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. MySQL Query verkar inte ge förväntningar

  2. postgresql-sekvens nextval i schema

  3. Finns det några goda skäl till att jag inte ska använda - (streck) i fältnamn i MySQL?

  4. Hur får jag min Java-applikation att identifiera sig för Oracle vid anslutning?