Ir para conteúdo
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

Compartilhar este post


Link para o post
Compartilhar em outros 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


 

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
    • Por gersonab
      Bom dia
      estou com uma dúvida de como proceder, tenho uma tabela de categoria e uma de subcategoria, a categoria pode ter várias subs, até ai tranquilo, quando faço update de uma sub altero normalmente a quantidade deste, até aí normal, porém me deparei com uma situação um pouco diferente, vou tentar ser o mais claro possível, de certa forma algumas subs são comuns só mudando o nome praticamente, aí eu preciso que ao efetuar o update em umas destas este ocorra nas demais, tipo:
       
      Se o id da sub for 5 , eu preciso fazer o mesmo update nos ids 6 e 7 ;
       
      Se o id da sub for 9 , eu preciso fazer o mesmo update no id 10
       
      se for 2 , fazer o update somente neste
       
      ainda não estou conseguindo ver uma lógica para isso, e ou uma nova coluna para cadastrar em comum nestes casos.
       
      qual seria a melhor opção
    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por JoaoSilva75
      oi pessoal
       
      se eu entrar no link dos desenvolvedores php pesquisasar quem é programador e enviar uma mesma mensagem para uns 6 ou 8 membros do forum serei advertido   ou é spam ???????
       
      procuro um programador php para me fazer algo 
       
      mas não tem como postar aqui nessa sessão
       
    • Por clovis.sardinha
      Tenho uma consulta de autocomplete no bd que funciona no servidor local e não roda no servidor da web. 
      Ao enviar a consulta no servidor local  aparece no console :Fetch terminou o carregamento: GET ".../Cidade?cidade=sao%20paulo". A pesquisa é feita normalmente.
      Quando mando a mesma pesquisa para o servidor web(locaweb) aparece no console: Fetch terminou o carregamento: GET "..../Cidade?cidade=sao%2520paul".
      O número 25 aparece só no servidor web. Pelo que pesquisei 25 significa %, ou seja, está duplicando o caractere %. 
      Não consegui utilizar nenhuma função para evitar que isto ocorra. Alguém sabe se há alguma configuração no servidor web que possa ser alterada para evitar essa duplicação?
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.