Jump to content
  • 0
Hugo Rodrigues Campigotto

[Resolvido] Quantos porcento N item representa no total geral - Consulta

Question

Olá pessoal, bom dia.

Sou novo aqui no fórum e também iniciante em SQL. Gostaria da ajuda de vocês para finalizar a query abaixo:

 

Preciso de uma query que me dê o resultado da tabela abaixo:

ibexpert-query-perc-total-vendedor.jpg.fa71dbacf21012d5548abdad259ca7d0.jpg

 

Para tentar chegar a ela, fiz este código:

 

select p.vendedor, v.nome, sum(total) as TT, (A.SubTotal / B.Total * 100) as Perc

from pedidos p, vendedores v, ((select vendedor, sum(total) as SubTotal from pedidos group by vendedor) as A

cross join (select sum(total) as Total from pedidos) as B))

where p.vendedor = v.codigo

group by v.nome, p.vendedor

order by TT desc

 

Porém, o IBExpert me dá este erro anexo:

ibexpert-erro-query-perc-total-vendedor.thumb.jpg.5c7738526f9b6ead8f8c4510015f9d94.jpg

 

Alguém poderia me ajudar neste problema?

Share this post


Link to post
Share on other sites

12 answers to this question

Recommended Posts

  • 0

Qual BD ?

Alguns tem "analytic functions" que facilitam muito queries assim.

 

Share this post


Link to post
Share on other sites
  • 0
22 horas atrás, Motta disse:

 

Pelo que entendi, Motta, este recurso está disponível para a versão 3 do Firebird, correto?

Se for isso, tenho um problema, pois o banco que em estou trabalhando é mais antigo e, por isso estou tendo que usar a versão 2.0.

Faz sentido o que eu disse? Se sim, haveria outra forma de redigir esta query sem o OVER (pois não existe no 2.0)?

Share this post


Link to post
Share on other sites
  • 0

A solução seria algo na linha do que vocêcestava fazendo , tendo tempo amanhã tento editar uma solução.

Share this post


Link to post
Share on other sites
  • 0

Pode ser que não funcione pois alguns bds não permitem tabelas virtuais

-- total por venderor
select p.vendedor, v.nome, sum(total) as TT
from pedidos p, vendedores v
where p.vendedor = v.codigo
group by v.nome, p.vendedor

--total geral

select sum(total) as TG
from pedidos p, vendedores v
where p.vendedor = v.codigo 

--GERAL
select vendedor, nome ,TT,TG ,ROUND(((TT/TG)*100),20 PERC
FROM (select p.vendedor, v.nome, sum(total) as TT , totg.TG
        from pedidos p, vendedores v , (select sum(total) as TG
                                        from pedidos p, vendedores v
                                        where p.vendedor = v.codigo) totg
        where p.vendedor = v.codigo
        group by v.nome, p.vendedor) X

 

Share this post


Link to post
Share on other sites
  • 0
6 horas atrás, Motta disse:

Pode ser que não funcione pois alguns bds não permitem tabelas virtuais


-- total por venderor
select p.vendedor, v.nome, sum(total) as TT
from pedidos p, vendedores v
where p.vendedor = v.codigo
group by v.nome, p.vendedor

--total geral

select sum(total) as TG
from pedidos p, vendedores v
where p.vendedor = v.codigo 

--GERAL
select vendedor, nome ,TT,TG ,ROUND(((TT/TG)*100),20 PERC
FROM (select p.vendedor, v.nome, sum(total) as TT , totg.TG
        from pedidos p, vendedores v , (select sum(total) as TG
                                        from pedidos p, vendedores v
                                        where p.vendedor = v.codigo) totg
        where p.vendedor = v.codigo
        group by v.nome, p.vendedor) X

 

Motta, infelizmente não rodou.

Eu consegui dar uma melhorada no código e ele me trouxe "quase" o que preciso:

 

select

    vendedor, A.SubTotal, (A.SubTotal / B.Total * 100) as Perc

from

    (select vendedor, sum(total) as SubTotal from pedidos group by vendedor) as A

    cross join (select sum(total) as Total from pedidos ) as B

order by Perc desc

 

ibexpert-query-perc-total-sem-nome-vendedor.jpg.e4555b28adb3a0597ea01097cae01a6c.jpg

 

O que está faltando agora é trazer o nome do vendedor que fica na tabela vendedores.

Estou tentando fazer por este código abaixo, mas ele entende que tem que replicar o nome para cada valor:

 

select distinct
  p.vendedor, v.nome, A.SubTotal, (A.SubTotal / B.Total * 100) as Perc
from
  pedidos p, vendedores v,
  (select p.vendedor, v.nome, sum(total) as SubTotal from pedidos p, vendedores v
   where p.vendedor = v.codigo group by p.vendedor, v.nome) as A
  cross join (select sum(total) as Total from pedidos p, vendedores v
   where p.vendedor = v.codigo ) as B
where p.vendedor = v.codigo
order by p.vendedor asc, Perc desc

 

ibexpert-erro-query-perc-total-vendedor-replicando.jpg.94fe5d20f9262660b0a290261b578ea3.jpg

 

E agora, consegue me dar mais uma pista?

 

 

 

Share this post


Link to post
Share on other sites
  • 0

TENTOU

select distinct
  p.vendedor, v.nome, A.SubTotal, (A.SubTotal / B.Total * 100) as Perc
from

  (select p.vendedor, v.nome, sum(total) as SubTotal from pedidos p, vendedores v
   where p.vendedor = v.codigo group by p.vendedor, v.nome) as A
  cross join (select sum(total) as Total from pedidos p, vendedores v
   where p.vendedor = v.codigo ) as B

order by p.vendedor asc, Perc desc

 

Share this post


Link to post
Share on other sites
  • 0
18 horas atrás, Motta disse:

TENTOU


select distinct
  p.vendedor, v.nome, A.SubTotal, (A.SubTotal / B.Total * 100) as Perc
from

  (select p.vendedor, v.nome, sum(total) as SubTotal from pedidos p, vendedores v
   where p.vendedor = v.codigo group by p.vendedor, v.nome) as A
  cross join (select sum(total) as Total from pedidos p, vendedores v
   where p.vendedor = v.codigo ) as B

order by p.vendedor asc, Perc desc

 

 

Ele está dando erro no select, pois, como foi tirada as tabelas (pedidos p e vendedores v), ele não está conseguindo selecionar os campos p.vendedor e v.nome da primeira linha!

Share this post


Link to post
Share on other sites
  • 0

creio ser só trocar os aliases


 

select distinct
  a.vendedor, a.nome, A.SubTotal, (A.SubTotal / B.Total * 100) as Perc
from

  (select p.vendedor, v.nome, sum(total) as SubTotal from pedidos p, vendedores v
   where p.vendedor = v.codigo group by p.vendedor, v.nome) as A
  cross join (select sum(total) as Total from pedidos p, vendedores v
   where p.vendedor = v.codigo ) as B

order by p.vendedor asc, Perc desc

 

Share this post


Link to post
Share on other sites
  • 0
5 horas atrás, Motta disse:

creio ser só trocar os aliases


 


select distinct
  a.vendedor, a.nome, A.SubTotal, (A.SubTotal / B.Total * 100) as Perc
from

  (select p.vendedor, v.nome, sum(total) as SubTotal from pedidos p, vendedores v
   where p.vendedor = v.codigo group by p.vendedor, v.nome) as A
  cross join (select sum(total) as Total from pedidos p, vendedores v
   where p.vendedor = v.codigo ) as B

order by p.vendedor asc, Perc desc

 

 

Muito bem, Motta!!! Agora deu certo. Muitíssimo obrigado pela ajuda!!

 

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 Dinho Nunes LC
      <div align="center" id="subtitulo"> Canais Abertos </div> <div class="ui cards"> <div class="card"> <div class="content"> <a href="globo.html" style="display: block; color: black"> <div align="center"> <div> <img class="ui tiny image" id="imagem_card_casa" src="assets/images/Rede_Globo_2014.png"> <div align="center" id = "nome_time_fora"> <b>Globo RJ</b> </div> </div> Onde "globo.html" seria substituído pelo link que esta em uma tabela do banco de dados.
       
      Já fiz a conexão. E tenho a base de dados pronta.
       
      Motivo pelo qual estou buscando ajuda:
       
      Faço manualmente a mudança de cada link (são mais de 300) diariamente para evitar copias de terceiros. Sendo assim poderia usar um CRUD para facilitar a troca dos links direto no banco de dados.
    • By jeanzinsousa
      Salve, Galera estou com uma dúvida estudando banco de dados e programação.
       
      escrevi a seguinte query:
       
      SELECT data_pg as diaria, SUM(valor_pg) as valor_diario, SUM(valor_despesa) as valor_despesa, (SELECT SUM(valor_pg) as dinheiro FROM pagamento WHERE tipo = 5 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_dinheiro, (SELECTSUM(valor_pg) as debito FROM pagamento WHERE tipo = 25 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_debito, (SELECT SUM(valor_pg) as credito FROM pagamento WHERE tipo = 15 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) astotal_credito FROM pagamento WHERE MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019 GROUP BY diaria ORDER BY `diaria`
       
      resultado:
      diaria  1 valor_diario valor_despesa total_dinheiro total_debito total_credito   2019-06-10 818.70 0 288.40 586.95 113.30 2019-06-11 169.95 0 288.40 586.95 113.30
       
       
       
       
      Como podem ver meu objetivo e separar por dia o resultado dos valores divididos por tipo de pagamento.
      porém o mesmo mostra a soma total nas subquery.
      quando coloco o group by order by dentro das subquerys apresenta a seguinte mensagem de erro: #1242 - Subquery returns more than 1 row 
       
       
      como resolver?
    • By JorgeeHenrique
      Bom dia, sou iniciante em Delphi, estou fazendo um Cadastro de Clientes, gostaria de usar três Edit´s para filtrar alguns  dados porem com o código abaixo consegui fazer apenas com 1 edit.text, como faço pra usar três e que se algum estiver em branco ele retorna o valor apenas do Edit.text que foi preenchido?
       
      Exemplo: 
       
      Quero buscar por Nome, Situação e Rota (Cliente a da rota B com situação C) e se algum desses campos estiver vazio ele busca apenas o que foi preenchido. Obrigado pela atenção!
       
      .
      procedure TFrm_Cadastro.Bt_BuscarClick(Sender: TObject); begin with Frm_Cadastro.Tbl_Clientes do begin Close; SQL.Clear; SQL.Add( 'Select * from Tbl_Cad_Clientes'); SQL.Add('where Cli_Nome like :nome'); ParamByName('nome').Value := '%' + txt_buscar_nome.Text + '%'; Open; end; end;  
    • By lemanoel
      Oi, alguem pode me ajudar?
       
      Tenho uma tabela de status por dia, e efetivo um registro só quando ha alterações.. exemplo:
      Dia 01, bom
      Dia 03, médio
      Dia 10, ruim
       
      Como encontrar o status do dia 07, via sql?
      Olhando pro exemplo sei que seria MÉDIO… mas nao tenho a menor ideia de como escrever o código....
    • By inhokinformatica
      Bom dia.
       
      Atualmente estou com dificuldades para executar um arquivo com instruções SQL diretamente no php. Tenho um planilha VBA que exporta as intruções e salva em um arquivo "xxxx.sql". São várias linhas, um exemplo a baixo.
      INSERT INTO `fl_mes_05`(`id`, `matricula`, `dia`, `entrada_normal`, `saida_lanche`, `entrada_lanche`, `saida_normal`) VALUES ('1','913154','01/05/2019','00:00','00:00','00:00','00:00'); INSERT INTO `fl_mes_05`(`id`, `matricula`, `dia`, `entrada_normal`, `saida_lanche`, `entrada_lanche`, `saida_normal`) VALUES ('2','913154','02/05/2019','06:56','00:00','00:00','13:14'); INSERT INTO `fl_mes_05`(`id`, `matricula`, `dia`, `entrada_normal`, `saida_lanche`, `entrada_lanche`, `saida_normal`) VALUES ('3','913154','03/05/2019','07:12','11:15','11:35','13:11'); Bem...
       
      Fiz o sistema para upload de arquivo
       
      formulario.php
      <form action="atualizar_frequencia.php" method="post" enctype="multipart/form-data"> <input type="file" name="arquivo" /> <input type="submit" value="Enviar"/> </form> upload_sql.php
      <?php error_reporting (E_ALL & ~ E_NOTICE & ~ E_DEPRECATED); session_start(); // inicia sessão include "../db.php"; // conecta no banco de dados **** PDO $file = $_FILES["arquivo"]; // Arquivo recebido $dir = "_frequencias/"; // Pasta para upload // Movendo o arquivo da pasta temporaria para pasta de destino if (move_uploaded_file($file["tmp_name"], "$dir/".$file["name"])) { echo "Upload Completo!<br>"; } else { echo "Erro. Upload não realizado."; exit; } // Abre o Arquvio no Modo r (para leitura) $arquivo = fopen ($dir."/".$file["name"], 'r'); // Lê o conteúdo do arquivo while(!feof($arquivo)) { //Mostra uma linha do arquivo $linha = trim(fgets($arquivo, 1024)); if($linha!=NULL){ echo $linha.'<br />'; }} echo "<br><br>".$dir.$file["name"]."<br><br>"; //mostras as linhas do arquivo sql $sql = file_get_contents($dir.$file["name"]); $qr = $PDO->exec($sql); if($qr){ echo "Sucesso! Dados salvos no BD"; exit; }else{ echo "ERRO..."; exit; } // Fecha arquivo aberto fclose($arquivo); ?> Até aí, tudo funcionou, consigo fazer o upload e ler o arquivo normalmente. Recentemente, consegui executar esse SQL no php para salvar os dados no banco mysql.
       
      O que preciso agora é atualizar os dados no banco de dados. O sistema apresenta erro ao enviar o arquivo novamente
       
×

Important Information

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