Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

  • Conteúdo Similar

    • Por ILR master
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Tenho 3 selects assim com varias categorias...
       
              $sql = "SELECT * FROM topicos          WHERE idcategoria = $idcategoria          AND pubdate BETWEEN NOW() - INTERVAL $intervalo1_horas_ou_minutos $tipo_intervalo1_horas_mnutos AND          NOW() - $intervalo2_horas_ou_minutos ORDER BY pubdate DESC LIMIT 1"; Preciso que na minha pagina principal (index) mostre este registro por 10minutos.. passando de 10 minutos mostra o resultado do proximo select (categoria)..
    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
    • Por douglas79
      Bom dia,

      Há alguns dias que venho instalar o apache, o php, mysql e o phpmyadmin manualmente e sem obter sucesso. Até consegui rodar o php, porém, quando vou baixar a úitima versão do MYSQL, não tem todos os pacotes nele instalados, inclusive no completo, só encontro o Router.
      Alguém pode me dizer o porquê que isso está ocorrendo?
      Desde já agradeço a ajuda de vocês, que será bem vinda!
      No aguardo!

      Uso a versão 8.3.9 do PHP
      Meu SO é o Windows 10 32 bits
×

Informação importante

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