Baixe o app para aproveitar ainda mais
Prévia do material em texto
23/04/2018 mysql - Como somar valores de um campo agrupado por data? - Stack Overflow em Português https://pt.stackoverflow.com/questions/12444/como-somar-valores-de-um-campo-agrupado-por-data 1/2 Como somar valores de um campo agrupado por data? Faça uma pergunta SELECT funcionario_id, data, avaliacao_postura FROM equipe id funcionario_id data avaliacao_postura 1 1 2014-03-02 -25;-10;-5;-12 2 1 2014-03-01 -25;-10;-18 3 1 2014-03-02 -25;-15;-14 Preciso fazer um select que me retorne a soma do campo fazendo a soma em todas as data iguais e em negativo e o resultado agrupado por data. O resultado teria que ser como neste exemplo: avaliacao_postura funcionario_id data avaliacao_postura 1 2014-03-02 -106 1 2014-03-01 -53 mysql sql-select editada 9/04/14 às 23:31 AndersonBS 2.721 2 17 43 perguntada 9/04/14 às 22:43 Neoelectronics 46 1 1 5 – Seria bem simples, não fosse a necessidade de somar na horizontal os valores dentro de , que é texto e não numérico.avaliacao_postura bfavaretto ♦ 9/04/14 às 22:48 2 Respostas Eu mudaria o design dessa tabela. Da maneira que dados estão armazenados agora você não consegue trazer nenhuma informação básica referente as avaliações. Um exemplo de uma nova estrutura: date smallint NOT NULL id funcionario_id data avaliacao_postura 1 1 2014-03-02 -25 2 1 2014-03-02 -10 3 1 2014-03-02 -5 4 1 2014-03-02 -12 5 1 2014-03-01 -25 6 1 2014-03-01 -10 7 1 2014-03-01 -18 8 1 2014-03-02 -25 9 1 2014-03-02 -15 10 1 2014-03-02 -14 Dessa maneira você consegue o resultado esperado com uma simples query. SELECT funcionario_id, data, SUM(avaliacao_postura) as avaliacao_postura FROM equipe GROUP BY funcionario_id, data respondida 10/04/14 às 2:36 Erico 675 3 9 1 – Esse é o modelo que eu teria feito deste o inicio ... user6026 10/04/14 às 14:41 Crie uma View no mesmo banco dessa tabela com esse Script ( é só rodar esse trecho ): Create View iterator (x) as select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6; Logo Após rode essa SQL: SELECT funcionario_id, data, sum(avaliacao_postura) avaliacao_postura from ( select substring_index( substring_index(equipe.avaliacao_postura,';',iter.x), ';', -1) AS avaliacao_postura, equipe.data, equipe.funcionario_id 23/04/2018 mysql - Como somar valores de um campo agrupado por data? - Stack Overflow em Português https://pt.stackoverflow.com/questions/12444/como-somar-valores-de-um-campo-agrupado-por-data 2/2 from equipe, iterator iter where iter.x <= length(equipe.avaliacao_postura)-length( replace(equipe.avaliacao_postura,';',''))+1 order by equipe.data, iter.x) AS C GROUP BY data ORDER BY data É uma forma razoável e que funcionou... Se eu fosse você mudaria o layout da sua tabela para compor a cada linha um item do avaliacao_postura, mas, esse rotina vai estraindo item a item dentro da string separada por e relaciona com os itens da View iterator. ; editada 4/05/14 às 23:48 respondida 10/04/14 às 0:17 user6026 1 – Você pode incluir uma explicação? Sua solução funciona, ao menos para esse caso, mas o funcionamento do método que você usou não é óbvio. bfavaretto ♦ 10/04/14 às 14:20 – @bfavaretto, essa solução foi a base de pesquisa, e realmente ela funciona, eu não faria assim eu faria um linha para cada dado de avaliacao_postura, ou seja, mudaria o layout da tabela ... user6026 10/04/14 às 14:38 1 – Entendo (eu também usaria outro layout), mas como você achou um jeito que nem requer chamada de função MySQL, seria legal para a comunidade que esse método fosse explicado em detalhes. É sempre recomendado incluir explicações nas respostas, e levar em consideração que sua resposta não é somente para quem fez a pergunta, e sim um conteúdo que pode vir a ajudar muitos outros futuros visitantes do site. Eu pessoalmente considero a explicação até mais importante que o código que resolve o problema, por ser mais genérica. bfavaretto ♦ 10/04/14 às 14:40 2 – Aproveitando, segue um demo da sua solução: sqlfiddle.com/#!2/a97d6/1 bfavaretto ♦ 10/04/14 às 14:43 – muito obrigado resolveu o meu problema, pensei que seria mais simples mais ja vi que nao. Neoelectronics 13/06/14 às 2:21
Compartilhar