SUM Diferente

23/04/2010

0

Bom dia pessoal,

Sou novo por aqui, estou com uma grande dificuldade em uma query.

Seguinte tenho uma tabela onde preciso somar um coluna (VALOR), Até aí tudo bem eu poderia simplesmente usar o SUM(), o problema é que existem uma outra coluna (FATOR), que basicamente aplica uma MULTIPLICAÇÃO nos valores anteriores...

Resumindo eu preciso de um SUM "Personalizado", que quando eu passasse um outro parâmetro, ele faria um outro processamento, vamos a um exemplo:

Imaginemos a Tabela:



ITEMS    VALOR  FATOR

Item1    10          0

Item1    10          0

Item1    0          2

Item1    10          0

Se eu fizesse um Select como esse:

SELECT [ITEM]
  ,SUM([VALOR])
  ,SUM([FATOR])
FROM [TRADINGBUS].[dbo].[TESTE]
GROUP BY [ITEM]
Teria esse resultado:

ITEMS  VALOR    FATOR

Item1    30          2



Porém, eu preciso de um código tipo assim:



SELECT [ITEM]
  ,SUM_FAZ_CHOVER([VALOR], [FATOR])
  ,SUM([FATOR])
FROM [TRADINGBUS].[dbo].[TESTE]
GROUP BY [ITEM]





FUNCTION SUM_FAZ_CHOVER(VALOR INT, FATOR INT)
AS
BEGIN

IF(FATOR 0)
MULTIPLICA O SUM DA COLUNA [VALOR] PELO [FATOR]
ELSE
FAZ O SUM "NORMAL"
END IF

END



Dessa forma meu resultado seria:



ITEMS  VALOR    FATOR

Item1    50          2



Pois a conta seria (10 + 10)  * 2 + 10 = 50



Para uma coleção maior...

ITEMS  VALOR    FATOR

Item1    10          0

Item1    10          0

Item1    0            2

Item1    10          0

Item2    10          0

Item2    0            3

Item2    10          0

Item3    10          0

Item3    10          0



Eu teria:



ITEMS  VALOR  FATOR

Item1    50          2

Item2    40          3

Item3    20          0 



É importante que esse processamento seja feito pelo banco de dados e retorne a coleção já pronta para a aplicação.

É possível criar uma função como esta?

Obrigadão!!!
Thiago Santiago

Thiago Santiago

Responder

Posts

23/04/2010

Wilson Junior

Nem precisa criar função, utilize assim:

SUM( Valor * IIF(Fator = 0, 1, Fator) )


Espero ter colaborado.
Responder

23/04/2010

Thiago Santiago


Nem precisa criar função, utilize assim:

SUM( Valor * IIF(Fator = 0, 1, Fator) )


Espero ter colaborado.

     
 


Cara, tem certeza que essa parada funciona para SQLServer2005 coloquei no meu código ele nem reconhece "IIF" como palavra reservada... e da erro...

dei uma olhada na net, e tinha uma galera falando que IIF é pro ACCESS... no SQL usa CASE...
mas, valeu pela dica!

abraços!
Responder

23/04/2010

Wilson Junior

Utilizo o IIF para o Firebird 2.1, e como você não especificou qual banco estava utilizando, resolvi colocar este mesmo para você ter uma idéia.

Espero ter colaborado.
Responder

23/04/2010

Thiago Santiago


Nem precisa criar função, utilize assim:

SUM( Valor * IIF(Fator = 0, 1, Fator) )


Espero ter colaborado.

     
 


Então... outra coisa... quando utilizo a sua Base.... tenho um problema... a multiplicação é feita sobre o registro da coluna atual... mas na verdade... eu preciso que a multiplicação seja "retroativa"... ou seja.... aplicada as linhas anteriores...



por exemplo....



ITEMS    VALOR  FATOR


Item1    10          0            ----> Valor                    = 10

Item1    10          0            ----> Valor = (Valor + Valor)  =  20

Item1    0          2            ----> Valor = (2 * Valor)      =  40

Item1    10          0            ----> Valor = (Valor + Valor)  =  50



Resultado Final.... Valor = 50



Seria isso....

=/



valeu...
Responder

23/04/2010

Wilson Junior

Hum...tinha entendido que era para a linha atual, me desculpe.
Bom, para isto terá mesmo que fazer uma FUNCTION para retornar o valor, pois o SQL simples não tem como acumular os dados de outros registros.

Espero ter colaborado.
Responder

18/06/2010

Marcilio Marcon

Dá uma olhada nestes artigos http://www.databasejournal.com/features/mssql/article.php/3112381/SQL-Server-Calculating-Running-Totals-Subtotals-and-Grand-Total-Without-a-Cursor.htm   http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver   Espero ter ajudado
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar