Jump to content
Felipe Guedes Coutinho

[Resolvido] SELECT de 3 Tabelas Sem Relacionamento com SUM com RANGE de DATA.

Recommended Posts

Galera, venho contribuindo com diversas dúvidas, mas hoje quem está com uma dúvida sou eu.

 

Cenário - Gerar Dados para Relatório de Faturamento.

Objetivo - Obter os valores totais das tabelas de Compra, Venda e Despesa agrupados por mês através de SUM dentro do "periodo" passado pela tela de consulta do relatório.

Problema - Não existe um relacionamento entre as tabelas e eu preciso obter os resultados por 1 (UM) único select pois a cada registro lido com os valores totalizados e agrupados por mês eu movimento para um array onde o resultado do array é movimentado para um Chart do Google que gera um gráfico.

 

Insumos:

Tabela compra

image.png.3e1336108de7c472adcad5fef251b3e1.png

RESULTADO SEPARADO DA TABELA COMPRA

SELECT  sum(vlr_pago),
        CASE extract(MONTH from dt_registro_compra)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
        FROM db_pescado_gelo.sqltb_compra
        WHERE dt_registro_compra between '2019-01-01' and '2019-12-31'
group by mes
order by dt_registro_compra asc

 

RESULTADO:

image.png.c80b1d7335dfa859efa36b5f089ae3e4.png

 

Tabela Venda

image.png.9817a40bda85ebdb428f3f4d2ad8e5e0.png

RESULTADO SEPARADO DA TABELA VENDA

SELECT  sum(vlr_vale),
        CASE extract(MONTH from dt_registro_venda)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
        FROM db_pescado_gelo.sqltb_venda
        WHERE dt_registro_venda between '2019-01-01' and '2019-12-31' 
group by mes
order by dt_registro_venda asc

 

RESULTADO:

image.png.25b96353685f8a3d6c8b765540c117e1.png

 

Tabela Despesa

image.png.14722c9001a901ffe9e5cb75014dbbc4.png

Sei que devo colocar dt_pagamento is not null

RESULTADO SEPARADO DA TABELA DESPESA

SELECT  sum(vlr_pago),
        CASE extract(MONTH from dt_pagamento)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
        FROM db_pescado_gelo.sqltb_despesa
        WHERE dt_pagamento between '2019-01-01' and '2019-12-31'
          AND dt_pagamento is not null
group by mes
order by dt_pagamento asc

 

RESULTADO:

image.png.e07ac8d362490946ac9859787e056705.png

 

 

O resultado que eu gostaria é algo parecido com isso:

 

TABELA DE VENDA TABELA DE COMPRA TABELA DE DESPESA
- - R$ 31.272,55 Julho - -
Agosto R$ 3.796,53 R$ 20.687,20 Agosto R$ 3.796,53 Agosto

 

Esse resultado eu "preciso" que seja através do retorno do um único SELECT, se alguém puder me ajudar, ficarei muito agradecido.

 

Se puderem dar uma forã agradeço @Motta ; @Omar~ ; @Maujor ; @gabrielms 

 

Att.

Felipe Coutinho

Share this post


Link to post
Share on other sites

tente

select sum(compra) compra,
       Sum(venda) venda,
       Sum(despesa) despesa,
       Mes
from(
 SELECT  sum(vlr_pago) compra,
         0 venda,
         0 despesa
        CASE extract(MONTH from dt_registro_compra)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
        FROM db_pescado_gelo.sqltb_compra
        WHERE dt_registro_compra between '2019-01-01' and '2019-12-31'
group by mes
union
SELECT  0 compra,
        sum(vlr_vale) venda,
        0 despesa
        CASE extract(MONTH from dt_registro_venda)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
       FROM db_pes cado_gelo.sqltb_venda
        WHERE dt_registro_venda between '2019-01-01' and '2019-12-31'
group by mes
union
 RESULTADO SEPARADO DA TABELA DESPESA

SELECT  0 compra,
        0 venda
        sum(vlr_pago) despesa,
        CASE extract(MONTH from dt_pagamento)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
        FROM db_pescado_gelo.sqltb_despesa
        WHERE dt_pagamento between '2019-01-01' and '2019-12-31'
          AND dt_pagamento is not null
group by mes
) virtual
group by mes


 

Share this post


Link to post
Share on other sites

@Motta

 

Tentei o SELECT que você mandou, mas está apresentando dado de ALIAS

 

Error Code : 1248
Every derived table must have its own alias

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

 

Spoiler

select *
from(
 SELECT  sum(vlr_pago) compra,
         0 venda,
         0 despesa,
        CASE extract(MONTH from dt_registro_compra)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
        FROM db_pescado_gelo.sqltb_compra
        WHERE dt_registro_compra between '2019-01-01' and '2019-12-31'
group by mes
union
SELECT  0 compra,
        sum(vlr_vale) venda,
        0 despesa,
        CASE extract(MONTH from dt_registro_venda)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
       FROM db_pescado_gelo.sqltb_venda
        WHERE dt_registro_venda between '2019-01-01' and '2019-12-31'
group by mes
union
SELECT  0 compra,
        0 venda,
        sum(vlr_pago) despesa,
        CASE extract(MONTH from dt_pagamento)
            WHEN 1 THEN 'Janeiro'
            WHEN 2 THEN 'Fevereiro'
            WHEN 3 THEN 'Março'
            WHEN 4 THEN 'Abril'
            WHEN 5 THEN 'Maio'
            WHEN 6 THEN 'Junho'
            WHEN 7 THEN 'Julho'
            WHEN 8 THEN 'Agosto'
            WHEN 9 THEN 'Setembro'
            WHEN 10 THEN 'Outubro'
            WHEN 11 THEN 'Novembro'
            WHEN 12 THEN 'Dezembro'
        END AS mes
        FROM db_pescado_gelo.sqltb_despesa
        WHERE dt_pagamento between '2019-01-01' and '2019-12-31'
          AND dt_pagamento is not null
group by mes
)

 

O select usado está no SPOILER

Share this post


Link to post
Share on other sites

@Motta

 

Não sei como lhe agradescer fera, muito bom mesmo, não sei como lhe agradescer, a sua query funcionou como eu preciso, apenas precisei colocar a ordenação pelo número do mês, pois pelo nome agosto vem antes de fevereiro e estava bagunçando o resultado, mas após colocar o order by pelo número do mês no lugar do nome obtive o resultado exato.

 

Muito obrigado mesmo pela sua ajuda.

 

Preciso de uma ajuda para colocar o tópico como resolvido, pois olhei aqui na página e não achei a opção.

 

Grato.

 

Att.

Felipe Coutinho

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Ferdz-Agencia-Digital
      @Matheus Tavares
       
      Estou montando uma API para usar com BD MySQL, mas futuramente migraremos o BD para MongoDB... deverei mudar muitas coisas da API ? Terei muito retrabalho ?
       
      O que acontece é que o projeto já existe e atualmente o BD é em MySQL e APIs em PHP... mas o projeto será migrado para a stack  MERN (MongoDB, Express, React e Node).
       
      A questão não é só performance, mas sim poder modernização pois o projeto irá se expandir precisa ser melhor escalável e a STACK será todo refeita, como disse acima, será usada MERN.
    • By FerdzFernando
      Estou montando uma API para usar com BD MySQL, mas futuramente migraremos o BD para MongoDB... deverei mudar muitas coisas da API ? Terei muito retrabalho ?
       
      O que acontece é que o projeto já existe e atualmente o BD é em MySQL e APIs em PHP... mas o projeto será migrado para a stack  MERN (MongoDB, Express, React e Node)
    • By gersonab
      Boa tarde, preciso fazer uma busca por um ou mais itens, consigo fazer a busca pelo mês e ano, porém se eu quiser colocar tb a pessoa e mais uma condição não esta dando certo.
      <?php $mes=(int)$_POST['mes']; $ano=(int)$_POST['ano']; $idp=(int)$_POST['idp']; $pagoparc=$_POST['pagoparc']; $consulta1 = $pdo->query("SELECT parcelas.idpar, parcelas.procid, parcelas.procli, parcelas.proadv, parcelas.valorp,parcelas.valorpe, parcelas.valoradv, parcelas.valorpago, parcelas.datapar, parcelas.datapago, parcelas.pagoparc, parcelas.obspar, cli.idc, cli.nomec, proc.idpr, proc.proces, prof.idp, prof.nomep FROM parcelas LEFT JOIN cli ON cli.idc = parcelas.procli LEFT JOIN proc ON proc.idpr = parcelas.procid LEFT JOIN prof ON prof.idp = parcelas.proadv WHERE Month(parcelas.datapar) = $mes AND YEAR(parcelas.datapar) = $ano AND parcelas.proadv LIKE '%$idp%' AND parcelas.pagoparc LIKE '%$pagoparc%' ORDER BY parcelas.idpar ASC"); while ($user1 = $consulta1->fetch(PDO::FETCH_ASSOC)) { ?> desta forma retorna todos os resultados independente do mês  e ano
       
      <?php $mes=(int)$_POST['mes']; $ano=(int)$_POST['ano']; $idp=(int)$_POST['idp']; $pagoparc=$_POST['pagoparc']; $consulta1 = $pdo->query("SELECT parcelas.idpar, parcelas.procid, parcelas.procli, parcelas.proadv, parcelas.valorp,parcelas.valorpe, parcelas.valoradv, parcelas.valorpago, parcelas.datapar, parcelas.datapago, parcelas.pagoparc, parcelas.obspar, cli.idc, cli.nomec, proc.idpr, proc.proces, prof.idp, prof.nomep FROM parcelas LEFT JOIN cli ON cli.idc = parcelas.procli LEFT JOIN proc ON proc.idpr = parcelas.procid LEFT JOIN prof ON prof.idp = parcelas.proadv WHERE Month(parcelas.datapar) = $mes AND YEAR(parcelas.datapar) = $ano AND parcelas.proadv = $idp AND parcelas.pagoparc = $pagoparc ORDER BY parcelas.idpar ASC"); while ($user1 = $consulta1->fetch(PDO::FETCH_ASSOC)) { ?> já desta forma me retorna este erro :
      Fatal error: Call to a member function fetch() on a non-object in
       
      lembro que nesta busca posso ter ou não o idp e ou pagoparc
    • By Sapinn
      Fala galera, como faço para enviar multiplos campos com o mesmo name ?
       
      O codigo no form é:
      <?php foreach($produtos as $item)?>
          <form action="enviar.php">
               <input name="nome_produto[]">
         </form>
      <?php endforeach;?>
       
      e no meu arquivo para enviar:
      $produtos = $_POST['nome_produtos'];
       
      foreach($produtos as $item){
           //Aqui eu envio os dados
      }
       
      O problema é que ele so está pegando o valor inserido no primeiro campo, nos demais ele não pega
    • By gersonab
      boa tarde, tenho duas tabelas, utilizo inner ou left em outros casos e funcionam, porém neste caso específico não esta funcionando, em vez de trazer 1 ou 3 registros que estariam em comum , esta trazendo pra mais de mil.
      tipo, eu tenho uma tabela clientes e outra tabela trabalho, todos os trabalhos estão ligados a um cliente pelo id do cliente, preciso ao consultar através de um formulário que este me mostre os trabalhos do cliente em questão, porém esta mostrando vários clientes com o mesmo trabalho.
      <div class="table-responsive mb-4 mt-4"> <table class="table table-striped"> <thead> <tr> <th> Ação </th> <th> id </th> <th> Nome </th> <th> Processo </th> </tr> </thead> <tbody> <?php $idc=(int)$_POST['idc']; $consulta = $pdo->prepare("SELECT cli.idc, cli.nomec, proc.idpr, proc.part, proc.proces FROM cli LEFT JOIN proc ON proc.part=:idc"); $consulta->bindParam(':idc', $idc, PDO::PARAM_STR); $consulta->execute(); while($linha = $consulta->fetch(PDO::FETCH_ASSOC)){ $idc = $linha['idc']; $idpr = $linha['idpr']; $proces = $linha['proces']; $nomec = $linha['nomec']; $part = $linha['part']; ?> <tr> <td ><input type="radio" name="idc" class="idc" value="<?php echo $idc; ?>"></td> <td><?php echo $idc; ?></td> <td><?php echo $nomec; ?></td> <td><a href="listclienteproc.php?idpr=<?php echo $idpr; ?>"><?php echo $proces; ?></a></td> </tr> <?php } ?> </tbody> </table> preciso que me mostre os trabalhos no caso da coluna part que é o id do cliente - idc
      o mesmo esta por post pq no formulário de consulta há 5 inputs de auto preenchimento que informa o idc do cliente a ser passado
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.