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 First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • 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
×

Informação importante

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