Fórum Agrupar resultados de um select #600759
25/02/2019
0
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.

Ramon Santos
Curtir tópico
+ 0Post mais votado
25/02/2019
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.
Hélio Devmedia

Gostei + 1
Mais Posts
25/02/2019
Ana Lichirgu
Espero que dê certo!
Gostei + 0
25/02/2019
Ramon Santos
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
Gostei + 0
25/02/2019
Ramon Santos
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
Gostei + 0
25/02/2019
Hélio Devmedia
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...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)