Ir para conteúdo
  • Cadastre-se

dev botao

Duvida com subselect + group by


felipeiw
  • Este tópico foi criado há 1269 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

To precisando montar um sql que traga o codigo, nome do cliente, total em vendas e total em trocas dos pedidos com data FATURA is null

tabela PEDIDOS tem o codigo, tabela PEDIDOSITENS sao os itens vendidos e CLIENTES tabela de clientes

dessa maneira da erro Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

uso FB 2.0

SELECT A.CODIGO, C.NOME
(SELECT SUM(E.QNT * E.PRECO) FROM PEDIDOSITENS E WHERE A.NUMERO = E.NUMERO AND E.TIPO = 'VENDA') AS VENDAS,
(SELECT SUM(F.QNT * F.PRECO) FROM PEDIDOSITENS F WHERE A.NUMERO = F.NUMERO AND F.TIPO = 'TROCA') AS TROCAS
FROM PEDIDOS A, CLIENTES C
WHERE A.FATURA IS NULL
GROUP BY A.CODIGO, C.NOME

Alguma sujestão por favor, travei nesse sql 

Obrigado

Link para o comentário
Compartilhar em outros sites

O erro ocorre porque as colunas "VENDAS" e "TROCAS" não estão especificadas "no GROUP BY" e, como existe uma cláusula "GROUP BY", estas não estão sendo buscadas a partir de uma Função Agregadora (COUNT, SUM, AVG, MAX, MIN e LIST).

Sim, tu estás utilizando SUM, ali, mas apenas nos "SELECT de dentro". O "SELECT de fora" não irá enxergá-los, só irá enxergar os resultados que eles retornam.

Também esqueceste de ligar as tabelas "PEDIDOS" e "CLIENTES".
 

Link para o comentário
Compartilhar em outros sites

Obrigado amigo pela resposta, 

Mais não consegui montar esse sql, mesmo com sua explicação VENDAS E TROCAS é como vc disse do select de dentro e resultados de um SUM, não deu certo colocando-as no group by, quanto as tabelas PEDIDOS e CLIENTES ja corrigi.

Consegue por favor se possivel claro, monta-la ?

Abs

Link para o comentário
Compartilhar em outros sites

Fiz para Oracle, creio que seja parecido para Firebird 2.0.

SELECT ped.codigo                          codigo
     , cli.nome                            nome
     , SUM (peditven.qnt * peditven.preco) vendas
     , SUM (pedittro.qnt * pedittro.preco) trocas
  FROM pedidos      ped
  JOIN pedidositens peditven ON ((peditven.numero = ped.numero) AND
                                 (peditven.tipo   = 'VENDA'))
  JOIN pedidositens pedittro ON ((pedittro.numero = ped.numero) AND
                                 (pedittro.tipo   = 'TROCA'))
  JOIN clientes     cli      ON (<ligar com a tabela pedidos>)
 WHERE ped.fatura IS NULL
 GROUP BY ped.codigo
        , cli.nome;

 

Link para o comentário
Compartilhar em outros sites

Em 04/10/2020 at 17:31, felipeiw disse:

To precisando montar um sql que traga o codigo, nome do cliente, total em vendas e total em trocas dos pedidos com data FATURA is null

tabela PEDIDOS tem o codigo, tabela PEDIDOSITENS sao os itens vendidos e CLIENTES tabela de clientes

dessa maneira da erro Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

uso FB 2.0



SELECT A.CODIGO, C.NOME
(SELECT SUM(E.QNT * E.PRECO) FROM PEDIDOSITENS E WHERE A.NUMERO = E.NUMERO AND E.TIPO = 'VENDA') AS VENDAS,
(SELECT SUM(F.QNT * F.PRECO) FROM PEDIDOSITENS F WHERE A.NUMERO = F.NUMERO AND F.TIPO = 'TROCA') AS TROCAS
FROM PEDIDOS A, CLIENTES C
WHERE A.FATURA IS NULL
GROUP BY A.CODIGO, C.NOME

Alguma sujestão por favor, travei nesse sql 

Obrigado

tenta assim:

SELECT CODIGO,NOME,SUM(VENDAS) AS VENDAS,SUM(TROCAS) AS TROCAS FROM (
SELECT A.CODIGO, C.NOME
(SELECT SUM(E.QNT * E.PRECO) FROM PEDIDOSITENS E WHERE A.NUMERO = E.NUMERO AND E.TIPO = 'VENDA') AS VENDAS,
(SELECT SUM(F.QNT * F.PRECO) FROM PEDIDOSITENS F WHERE A.NUMERO = F.NUMERO AND F.TIPO = 'TROCA') AS TROCAS
FROM PEDIDOS A, CLIENTES C
WHERE A.FATURA IS NULL
)
GROUP BY CODIGO,NOME

precisaria de uma base para testar

Editado por datilas
Link para o comentário
Compartilhar em outros sites

Bastaria apenas trocar JOIN por LEFT JOIN, ficando:

   SELECT ped.codigo                          codigo
        , cli.nome                            nome
        , SUM (peditven.qnt * peditven.preco) vendas
        , SUM (pedittro.qnt * pedittro.preco) trocas
     FROM pedidos      ped
LEFT JOIN pedidositens peditven ON ((peditven.numero = ped.numero) AND
                                     (peditven.tipo   = 'VENDA'))
LEFT JOIN pedidositens pedittro ON ((pedittro.numero = ped.numero) AND
                                     (pedittro.tipo   = 'TROCA'))
     JOIN clientes     cli      ON (<ligar com a tabela pedidos>)
    WHERE ped.fatura IS NULL
    GROUP BY ped.codigo
            , cli.nome;

 

Neste caso, as colunas "VENDAS" e "TROCAS" serão NULL quando não houverem valores nas tabelas filhas.

Caso não queiras NULL, poderás tratá-lo através das Funções COALESCE/NVL.

 

Editado por Rho Kurcinae
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1269 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.