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 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?
       
       
    • Por eduardohaag
      Boa noite pessoal,
      Esbarrei em um novo problema com consultas no meu sistema.
       
      Tenho um formulário no sistema que deverá apresentar todos os materiais utilizados em uma determinada Venda e seus respectivos estoques obtidos através da soma das entradas e saidas do estoque.
      Para isso devo buscar os dados em 3 tabelas do banco de dados sendo elas VendasProdutos, Composicao,  Materiais e Estoque

       
      Eis que surge meu problema, como posso ter vários produtos na venda e alguns produtos usam os mesmos materiais, a consulta está retornando com os materiais duplicados, quando o que eu gostaria era que somasse de acordo com cada material.
       
      A query que estou usando para teste no acesso é a seguinte:
      SELECT Composicao.IdMaterial, materiais.descricao, Sum(Estoque.Quantidade) AS Estoque, [VendasProdutos]![Quantidade]*[Composicao]![Quantidade] AS TotalUtilizado FROM (VendasProdutos LEFT JOIN (materiais RIGHT JOIN Composicao ON materiais.ID = Composicao.IdMaterial) ON VendasProdutos.IdProduto = Composicao.IdProduto) LEFT JOIN Estoque ON materiais.ID = Estoque.IdMaterial GROUP BY Composicao.IdMaterial, materiais.descricao, [VendasProdutos]![Quantidade]*[Composicao]![Quantidade], VendasProdutos.IdVenda HAVING (((VendasProdutos.IdVenda)=1));  
      A consulta está retornando os dados dessa forma:

       
      E eu gostaria de que agrupasse por ex:
       
      ID                Descricao                Estoque               TotalUtilizado
      1                 Capa Agenda             34                             10
      2                 Miolo Agenda            27                              5
       
      Alguem Sabe como posso fazer isso?
      Desulpem pelo post gigante, mas não sabia como explicar melhor.
    • Por Lucast
      Olá galera estou fazendo um select em duas tabelas porém preciso que o valor delas seja subtraido porém eu ja tentei e não consegui, deixarei o codigo abaixo das querys que preciso fazer a subtração
       
      SELECT COUNT(*) AS MES  
×

Informação importante

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