Agrupar resultados de um select

25/02/2019

15

Olá meus amigos,

Estou rodando um select para obter os valores agrupados de 4 tabelas. Porém os resultados estão vindo ordenados por lançamento, gostaria de um apoio pra obter essa informação agrupada.

SELECT
T.TP_DESCRICAO as PAGAMENTO, T.TP_DESCRICAO AS TOTAL
FROM VENDAS V
INNER JOIN CLIENTES C ON C.CLI_CODIGO = V.CLI_CODIGO
INNER JOIN CONTAS_RECEBER P ON P.VEN_COD_PEDIDO = V.VEN_COD_PEDIDO
LEFT JOIN TIPO_PAGAMENTO T ON T.TP_CODIGO = P.TP_CODIGO
WHERE V.VEN_DATA BETWEEN :dDataDe AND :dDataAte
and v.tx_codigo ='1'
group by PAGAMENTO, TOTAL


Preciso agrupar os campos T.TP_DESCRICAO e T.TP_DESCRICAO e trazê-los como somatório em duas colunas apenas.
Responder

Post mais votado

25/02/2019

Olá Ramos,

Ao que parece, você inverteu as informações dos campos do select e do group by...

o Group by existe para fazer contagem ou somatório de registros, por exemplo:


select
SUM(PAGAMENTO) as Pagamento
from
vendas
group by
descricao;


Esse código irá somar todos os pagamentos QUE TIVEREM A MESMA DESCRIÇÃO

Ao analisar o seu SQL encontrei situações que precisam ser melhor formuladas por exemplo:


SELECT
T.TP_DESCRICAO as PAGAMENTO,
T.TP_DESCRICAO AS TOTAL

isso não faz sentido, porque você está pedindo que mostre a descrição numa coluna com o nome pagamento, e depois a mesma descrição com o nome total na coluna...

outra situação

group by
PAGAMENTO, TOTAL

pagamento e total são valores numéricos que são altamente variáveis, geralmente esses valores devem ser usados em funções Min() Max() avg() ou sum() abaixo do Select. É muito difícil que haja uma situação em que o agrupamento será pelo valor do pagamento ou pelo valor total, geralmente o agrupamento é por nome, descrição, tipo, sexo, idade, cidade, etc...


Mais uma situação. Você fez joins por 4 tabelas só que em nenhum momento você usou os campos ta tabela clientes dentro do select, do where ou de outro join.

Não está errado, mas fazer isso só é válido quando você quer ter certeza que só pode mostrar um registro se a chave estrangeira está em outra tabela, caso contrário, não faz sentido joins em tabelas que não tem campos para utilizar na consulta.

Assim Ramos, peço por gentileza que verifique novamente a questão dos campos que você precisa somar, com os campos que você precisa agrupar para que seu select fique certo.
Responder

Mais Posts

25/02/2019

Ana Lichirgu

Boa tarde! O SQL não aceita agrupar pelos alias...tenta agrupar pelos nomes dos campos msm...

Espero que dê certo!
Responder

25/02/2019

Ramon Santos

Olá Ramos,

Ao que parece, você inverteu as informações dos campos do select e do group by...

o Group by existe para fazer contagem ou somatório de registros, por exemplo:


select
SUM(PAGAMENTO) as Pagamento
from
vendas
group by
descricao;


Esse código irá somar todos os pagamentos QUE TIVEREM A MESMA DESCRIÇÃO

Ao analisar o seu SQL encontrei situações que precisam ser melhor formuladas por exemplo:


SELECT
T.TP_DESCRICAO as PAGAMENTO,
T.TP_DESCRICAO AS TOTAL

isso não faz sentido, porque você está pedindo que mostre a descrição numa coluna com o nome pagamento, e depois a mesma descrição com o nome total na coluna...

outra situação

group by
PAGAMENTO, TOTAL

pagamento e total são valores numéricos que são altamente variáveis, geralmente esses valores devem ser usados em funções Min() Max() avg() ou sum() abaixo do Select. É muito difícil que haja uma situação em que o agrupamento será pelo valor do pagamento ou pelo valor total, geralmente o agrupamento é por nome, descrição, tipo, sexo, idade, cidade, etc...


Mais uma situação. Você fez joins por 4 tabelas só que em nenhum momento você usou os campos ta tabela clientes dentro do select, do where ou de outro join.

Não está errado, mas fazer isso só é válido quando você quer ter certeza que só pode mostrar um registro se a chave estrangeira está em outra tabela, caso contrário, não faz sentido joins em tabelas que não tem campos para utilizar na consulta.

Assim Ramos, peço por gentileza que verifique novamente a questão dos campos que você precisa somar, com os campos que você precisa agrupar para que seu select fique certo.


Ola amigo,

Obrigado pelo seu tempo
Fiz alguns ajustes porém mesmo assim não consigo extrair.

SELECT
COALESCE(max(T.TP_DESCRICAO),0) as PAGAMENTO ,
coalesce(sum(P.CR_VALOR_PARCELA),1) AS TOTAL
FROM VENDAS V
INNER JOIN CLIENTES C ON C.CLI_CODIGO = V.CLI_CODIGO
INNER JOIN CONTAS_RECEBER P ON P.VEN_COD_PEDIDO = V.VEN_COD_PEDIDO
LEFT JOIN TIPO_PAGAMENTO T ON T.TP_CODIGO = P.TP_CODIGO
WHERE V.VEN_DATA BETWEEN :dDataDe AND :dDataAte
and V.TX_CODIGO ='1'
group BY T.TP_DESCRICAO, P.CR_VALOR_PARCELA

Responder

25/02/2019

Ramon Santos

Olá Ramos,

Ao que parece, você inverteu as informações dos campos do select e do group by...

o Group by existe para fazer contagem ou somatório de registros, por exemplo:


select
SUM(PAGAMENTO) as Pagamento
from
vendas
group by
descricao;


Esse código irá somar todos os pagamentos QUE TIVEREM A MESMA DESCRIÇÃO

Ao analisar o seu SQL encontrei situações que precisam ser melhor formuladas por exemplo:


SELECT
T.TP_DESCRICAO as PAGAMENTO,
T.TP_DESCRICAO AS TOTAL

isso não faz sentido, porque você está pedindo que mostre a descrição numa coluna com o nome pagamento, e depois a mesma descrição com o nome total na coluna...

outra situação

group by
PAGAMENTO, TOTAL

pagamento e total são valores numéricos que são altamente variáveis, geralmente esses valores devem ser usados em funções Min() Max() avg() ou sum() abaixo do Select. É muito difícil que haja uma situação em que o agrupamento será pelo valor do pagamento ou pelo valor total, geralmente o agrupamento é por nome, descrição, tipo, sexo, idade, cidade, etc...


Mais uma situação. Você fez joins por 4 tabelas só que em nenhum momento você usou os campos ta tabela clientes dentro do select, do where ou de outro join.

Não está errado, mas fazer isso só é válido quando você quer ter certeza que só pode mostrar um registro se a chave estrangeira está em outra tabela, caso contrário, não faz sentido joins em tabelas que não tem campos para utilizar na consulta.

Assim Ramos, peço por gentileza que verifique novamente a questão dos campos que você precisa somar, com os campos que você precisa agrupar para que seu select fique certo.


Ola amigo,

Obrigado pelo seu tempo
Fiz alguns ajustes porém mesmo assim não consigo extrair.

SELECT
COALESCE(max(T.TP_DESCRICAO),0) as PAGAMENTO ,
coalesce(sum(P.CR_VALOR_PARCELA),1) AS TOTAL
FROM VENDAS V
INNER JOIN CLIENTES C ON C.CLI_CODIGO = V.CLI_CODIGO
INNER JOIN CONTAS_RECEBER P ON P.VEN_COD_PEDIDO = V.VEN_COD_PEDIDO
LEFT JOIN TIPO_PAGAMENTO T ON T.TP_CODIGO = P.TP_CODIGO
WHERE V.VEN_DATA BETWEEN :dDataDe AND :dDataAte
and V.TX_CODIGO ='1'
group BY T.TP_DESCRICAO, P.CR_VALOR_PARCELA



Obrigado a todos que colaboraram , resolvi tratando desta forma.

SELECT
COALESCE(max(T.TP_DESCRICAO),0) as PAGAMENTO,
coalesce(sum(P.CR_VALOR_PARCELA),1) AS TOTAL
FROM VENDAS V
INNER JOIN CONTAS_RECEBER P ON P.VEN_COD_PEDIDO = V.VEN_COD_PEDIDO
LEFT JOIN TIPO_PAGAMENTO T ON T.TP_CODIGO = P.TP_CODIGO
WHERE V.VEN_DATA BETWEEN :dDataDe AND :dDataAte
AND V.TX_CODIGO ='1'
group BY T.TP_DESCRICAO
Responder
Ramos, só entendi plenamente o que você realmente pretendia no seu ultimo SQL,

O Campo T.TP_DESCRICAO é um texto, então ele não vai pra função max, ele pode ir normalmente assim:


SELECT
T.TP_DESCRICAO as PAGAMENTO,
coalesce(sum(P.CR_VALOR_PARCELA),1) AS TOTAL,

já o resto está corretinho...
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira