Ir para conteúdo
  • 0
Hugo Rodrigues Campigotto

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

Pergunta

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

12 respostas a esta questão

Recommended Posts

  • 0

Qual BD ?

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

 

Compartilhar este post


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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0

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

Compartilhar este post


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

 

Compartilhar este post


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

 

 

 

Compartilhar este post


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

 

Compartilhar este post


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

Compartilhar este post


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

 

Compartilhar este post


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

 

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 PlatBubbles
      Ola, estou tendo dificuldade para fazer uma consulta seletiva usando duas tabelas, provavelmente estou errando a sintaxe da busca, agradeço caso alguem possa me passar a forma correta de fazer a busca.
       
      $sqluser = "SELECT aquestion_id, user_id FROM respostas WHERE user_id like '$logado' UNION SELECT * pergunta, question_id FROM questions WHERE question_id!=aquestion_id ORDER BY RAND() LIMIT 1"; Explicando
      Na tabela respostas preciso dos dados aquestion_id e user_id apenas do usuário Logado.
      Da tabela questions preciso da pergunta e da question_id que deve ser gerada de forma aleatória mas apenas com os Ids que não estejam  listados em aquestion_id.
      Na verdade as duas tabelas tinham o campo question_id porem estava confuso e por isso mudei o campo da primeira tabela para aquestion_id.
       
      Agradeço qualquer ajuda, e também pelo tempo dos que leram mesmo se não puderam ajudar.
      PlatBubbles
    • Por rogfranz
      Olá pessoal! Então, estou desenvolvendo um projeto que pode tomar grandes proporções, e estou com uma dúvida que está me tirando o sono!

      Digamos que trata-se de um sistema de pedidos só pra usar como exemplo.

      Vários usuários vão poder se cadastrar no sistema e criar seus pedidos.

      Teremos então as tabelas

      usuarios
      pedidos
      pedido_itens
       
       
      minha dúvida está na seguinte questão.
      Uso bancos de dados separados para cada cliente ?  
      ou
      Uma tabela por exemplo dos pedidos vinculo o id do usuário para todos usuários do sistema ?

      POR FAVOR! Me Deem a opinião do que vocês fariam! e Por que!

      Trazendo para a realidade do meu projeto uma estimativa de volume de dados que eu imagino.
      Levando em conta que um usuário pode cadastrar a média de 10 "pedidos" no mês com aproximadamente 500 ítens

      Agradeço muito a contribuição de vocês!
    • Por LuanMartinsTI
      Tenho o seguinte problema, eu preciso dar um select em duas tabelas, ou ter dois selects tanto faz, eu fiz com inner join e com union all mas nao consigo ter o resultado que eu desejo
      O problema é o seguinte> Pra saber quantos usuarios eu tenho em cada grupo eu preciso dar um select na membros grupo com o id do grupo, mas eu preciso mostrar apenas os 5 primeiros grupos com mais gente, eu nao tenho na tabela falando grupo 1 tem 50 membros, eu tenho 50 linhas com grupo 1 e id do usuario, como eu transformo isso no que eu quero? a unica forma q eu pensei é criar um campo novo em grupos e colocar la o resultado de rowCount, mas gostaria de saber se é possivel fazer sem, eu ja consigo mostrar quantos usuarios cada grupo tem, eu nao consigo mostrar é em ordem e nao é so dar o asc o problema é na logica provavelmente, mas se for possivel resolver isso com uma unica query ficarei grato
      tabela 1
      grupos( id nome dono created stat ) tabela 2
      membros_grupo( id grupo_id user_id )  
      PHP
      public function ultimosGrupos($limite){ try { $query = "SELECT * FROM groups ORDER BY id ASC LIMIT :limite"; $this->Select = $this->Conn->prepare($query); $this->Select->bindParam(':limite' , $limite, PDO::PARAM_INT); $this->Select->execute(); if($this->Select->rowCount() > 0){ return $this->Select->fetchAll(PDO::FETCH_ASSOC); }else{ return FALSE; } } catch (PDOException $exc) { exibeMensagens("Erro ao consultar. {$exc->getMessage()}", WS_ERROR); } } public function users_por_grupo($id){ try { $query = "SELECT * FROM group_memberships WHERE group_id = :id"; $this->Select = $this->Conn->prepare($query); $this->Select->bindParam(':id' , $id, PDO::PARAM_INT); $this->Select->execute(); return $this->Select->rowCount(); } catch (PDOException $exc) { exibeMensagens("Erro ao consultar. {$exc->getMessage()}", WS_ERROR); } }  
    • Por Fabiana Gomes
      Pessoal, boa noite
       
      Preciso de um help!!
       
      Tenho a tabela ENDERECO e na coluna LOUGRADOURO (40) preciso diminuir alguns endereços para 30 caracteres.
      Basicamente preciso cortar a partir da casa 30.
       
      Alguem pode me ajudar?
    • Por Lucast
      Boa tarde galera,
       
      Estou tentando fazer a soma de duas colunas no SQL e queria que ela me retornasse o valor separado em uma coluna a parte, podem me ajudar?
       
      Isso é o que estou fazendo
       
      SELECT MONTH(workOrderDate) AS MES, (SUM(CASE WHEN WorkType = '02' AND workOrderDescription = 'preventiva' THEN 1.0 ELSE 0 END)) AS preventiva, (SUM(CASE WHEN workOrderDescription = 'CORRETIVA' THEN 1 ELSE 0 END)) AS corretivas FROM WorkOrder WHERE YEAR(workOrderDate) = 2018 AND lastUpdateData IS NOT NULL GROUP BY MONTH(workOrderDate);  
      Esse resultado me retorna esses valores:
       
      https://imgur.com/5XqbmFX
       
      Preciso que ele me retorne uma coluna ao lado informando a soma de ambas as colunas.
       
      Alguém consegue me ajudar?
       
       
×

Informação importante

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