Jump to content

Archived

This topic is now archived and is closed to further replies.

MarKteus

Como gerar uma coluna extra com a soma dos valores de uma coluna?

Recommended Posts

é só usar a função SUM.

Dê mais detalhes do que precisa, ou de uma pesquisada no fórum :P

 

Abçs

Share this post


Link to post
Share on other sites

Boa noite

 

Alguém sabe como posso jogar as colunas resultado de um SELECT pra dentro de uma tabela temporária ? para depois dar um SUM em um campo ?

Share this post


Link to post
Share on other sites

MarKteus, vamos botar a casa em ordem? rs :P

 

 

o que você precisa? qual a versao do SQL? pode postar a estrutura ou o resultado esperado?

 

Abçs

Share this post


Link to post
Share on other sites

MarKteus, vamos botar a casa em ordem? rs :P

 

 

o que você precisa? qual a versao do SQL? pode postar a estrutura ou o resultado esperado?

 

Abçs

 

Sim claro vamos lá

 

select ped.CodPedido,

ped.dataPedido,

ped.Descricao,

pro.strMarca,

pro.Preco * tbc.intQuantidade AS Total,

tbc.Frete

From TB_PEDIDOS ped (NOLOCK)

Inner Join TB_CESTA tbc (NOLOCK) ON ped.codCesta = tbc.codCesta

Inner Join TB_PRODUTO pro (NOLOCK) ON pro.strCodigo = tbc.strCodigo

Where ((@CodPedido is null) or (ped.CodPedido = @CodPedido))

Order by ped.CodPedido

 

Preciso dar um SUM no campo pro.Preco, já tentei utilizar o GROUP BY (abaixo) porém está dando um erro

 

select ped.CodPedido,

ped.dataPedido,

ped.Descricao,

pro.strMarca,

SUM(pro.Preco) * tbc.intQuantidade AS Total,

tentei também SUM(pro.Preco * tbc.intQuantidade) AS Total,

e tentei também SUM(Total),

tbc.Frete

From TB_PEDIDOS ped (NOLOCK)

Inner Join TB_CESTA tbc (NOLOCK) ON ped.codCesta = tbc.codCesta

Inner Join TB_PRODUTO pro (NOLOCK) ON pro.strCodigo = tbc.strCodigo

Where ((@CodPedido is null) or (ped.CodPedido = @CodPedido))

Order by ped.CodPedido

GROUP BY ped.CodPedido

 

depois tentei

GROUP BY pro.CodProduto que é o cod la na tb_Produto

mas também nada

 

Como resolver esta questão ?

Share this post


Link to post
Share on other sites

O group deve ter TODOS os campos do select, o ORDER deve vir após.

 

select ped.CodPedido,
ped.dataPedido,
ped.Descricao,
pro.strMarca,
SUM(pro.Preco) * tbc.intQuantidade AS Total,
tentei também SUM(pro.Preco * tbc.intQuantidade) AS Total,
e tentei também SUM(Total),
tbc.Frete
From TB_PEDIDOS ped (NOLOCK)
Inner Join TB_CESTA tbc (NOLOCK) ON ped.codCesta = tbc.codCesta
Inner Join TB_PRODUTO pro (NOLOCK) ON pro.strCodigo = tbc.strCodigo
Where ((@CodPedido is null) or (ped.CodPedido = @CodPedido))
GROUP BY ped.CodPedido,
ped.dataPedido,
ped.Descricao,
pro.strMarca
Order by ped.CodPedido

Share this post


Link to post
Share on other sites

O group deve ter TODOS os campos do select, o ORDER deve vir após.

 

select ped.CodPedido,
ped.dataPedido,
ped.Descricao,
pro.strMarca,
SUM(pro.Preco) * tbc.intQuantidade AS Total,
tentei também SUM(pro.Preco * tbc.intQuantidade) AS Total,
e tentei também SUM(Total),
tbc.Frete
From TB_PEDIDOS ped (NOLOCK)
Inner Join TB_CESTA tbc (NOLOCK) ON ped.codCesta = tbc.codCesta
Inner Join TB_PRODUTO pro (NOLOCK) ON pro.strCodigo = tbc.strCodigo
Where ((@CodPedido is null) or (ped.CodPedido = @CodPedido))
GROUP BY ped.CodPedido,
ped.dataPedido,
ped.Descricao,
pro.strMarca
Order by ped.CodPedido

 

 

Valeu Motta mais mesmo assim não funciona, pois nem todos os campos são coincidentes.

Share this post


Link to post
Share on other sites

Não sei se é isto mas se pode somar os campos da tabela

 

SELECT COD,SUM(CAMPO1 + CAMPO2) SOMA
FROM TABELA
GROUP BY COD

Share this post


Link to post
Share on other sites

Não sei se é isto mas se pode somar os campos da tabela

 

SELECT COD,SUM(CAMPO1 + CAMPO2) SOMA
FROM TABELA
GROUP BY COD

 

No seu exemplo você está somando um campo com outro, mais eu necessito da somatória do mesmo campo:

pro.Preco * tbc.intQuantidade AS Total

e depois Total+Total será que funcionaria ?

Share this post


Link to post
Share on other sites

seria sum(pro.Preco * tbc.intQuantidade) as total

 

veja apenas se os campos tem os mesmos tipos pois pode ocorrer algum erro na conversão.

Share this post


Link to post
Share on other sites

seria sum(pro.Preco * tbc.intQuantidade) as total

 

veja apenas se os campos tem os mesmos tipos pois pode ocorrer algum erro na conversão.

 

 

Realmente não dá certo a quantidade campos (oriundos de 3 tables) inviabiliza a somatória, pois a cláusula GROUP BY se perde.

 

Mesmo assim obrigado.

Share this post


Link to post
Share on other sites

1) Não está gerando um produto cartesiano indevido ?

 

Faça um teste, faça a query sem Group, gere o resultado numa planilha excel e veja se o somatório fica correto.

Veja se não existe duplicidade indevida e se for o caso corriga a query.

 

Em último caso tente : Sum(distinct pro.Preco * tbc.intQuantidade) as total

 

Mas verifique a query

Share this post


Link to post
Share on other sites

Só pra você entender melhor coloquei na abertura do post somente um exemplo da query, na verdade ela é bem maior. Ela deve retornar mais + ou - menos uns 15 campos e pelo que sei segundo alguns testes o SUM e o Group precisam que todos os campos tenham valores iguais para que possam ser utilizados no GROUP BY, ou seja, mesmo que os campos Cod, Data sejam iguais os outros campos tbm precisaram e está muito dificil de todos os campos coincidirem, então ao encontrar um campo com valor diferente além do retorno me trazer linhas duplicadas traz sem a somatória.

 

Mesmo assim realizarei o teste que você me propôs a titulo de aprendizado, mas já estou me conformando em ter que criar tables temporárias. e liga-las com INNER JOIN

Share this post


Link to post
Share on other sites

Porque você não cria uma procedure? Nela, você monta sua tabela temporária que terá todos os pedidos, depois faz querys a partir desta tabela temporária, captura os valores das colunas que precis para montar sua soma e atualiza as colunas correspondentes na temp, um pedido por vez, e no fim simplesmente faz um select e soma/multiplica os valores da temp e joga como saída da procedure? É mais simples e provavelmente muito mais fácil de controlar via procedure que tentar por tudo num select só se a situação envolve tantas tabelas e valores.

 

[]'s

Share this post


Link to post
Share on other sites

Porque você não cria uma procedure? Nela, você monta sua tabela temporária que terá todos os pedidos, depois faz querys a partir desta tabela temporária, captura os valores das colunas que precis para montar sua soma e atualiza as colunas correspondentes na temp, um pedido por vez, e no fim simplesmente faz um select e soma/multiplica os valores da temp e joga como saída da procedure? É mais simples e provavelmente muito mais fácil de controlar via procedure que tentar por tudo num select só se a situação envolve tantas tabelas e valores.

 

[]'s

 

 

Chrnos

 

Foi + ou - assim que fiz, na verdade eu queria mesmo era evitar a criação de tables TEMP, mas ñ teve jeito.

 

Mesmo assim obrigado pelas sugestões de todos!

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.