sql >> Database >  >> RDS >> Mysql

MySQL pivot-achtige bewerking om een ​​uitsplitsing te krijgen van het percentage van de totale gebeurtenissen per dag per gebeurtenistype

U vraagt ​​om dynamische SQL. Dat wil zeggen, de queryreeks dynamisch opbouwen vanuit een andere query die verschillende event_type weergeeft waarden en voer het vervolgens uit. In MySQL wordt dit geïmplementeerd met behulp van voorbereide instructies.

Hier is hoe het te doen:

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; 

Voor uw voorbeeldgegevens levert dit de volgende query op:

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

En het volgende resultaat:

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 op DB Fiddle




  1. Dynamisch gegevens laden op div-scroll met behulp van php, mysql, jQuery en ajax

  2. Oracle - Gematerialiseerde weergave nog steeds toegankelijk tijdens volledige vernieuwing. Hoe werkt dit?

  3. Stumped SQL-uitzondering voor JDBC

  4. Een database verbinden met een Amazon VPC