Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Calcular (soma, max, avg) coluna separada por vírgulas no mysql


Não sei qual aplicativo você está projetando, mas acho que foi um design ruim armazenar valores separados por vírgula em vez de criar uma tabela de detalhes. Você pode resolver isso sem usar uma função mysql na verdade. Primeiro, você precisa convert comma separated columns into rows e então você pode fazer algum cálculo. Esta consulta pode ajudá-lo:
select id,max(val) as max,min(val) as min,sum(val) as sum,avg(val) as avg
from(
    select id,(substring_index(substring_index(t.poin, ',', n.n), ',', -1)) val
        from poin_dtl t cross join(
         select a.n + b.n * 10 + 1 n
         from 
            (select 0 as n union all select 1 union all select 2 union all select 3 
                union all select 4 union all select 5 union all select 6 
                union all select 7 union all select 8 union all select 9) a,
            (select 0 as n union all select 1 union all select 2 union all select 3 
                union all select 4 union all select 5 union all select 6 
                union all select 7 union all select 8 union all select 9) b
            order by n 
        ) n <-- To make this simple, Create a table with one column that has 100 rows.
    where n.n <= 1 + (length(t.poin) - length(replace(t.poin, ',', '')))
    order by val asc
) as c_rows -- c_rows = convert comma separated columns into rows
group by id

Os resultados devem ser assim:
id     max     min      sum      avg
--------------------------------------
1      1       9        23        4,6
2      8       2        19        4,75
3      9       1        33        5,5