Array
(
)

SUM Diferente

Thiago Santiago
   - 23 abr 2010

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!!!

Wilson Paulista...!!!
   - 23 abr 2010

Nem precisa criar função, utilize assim:

#Código
SUM( Valor * IIF(Fator = 0, 1, Fator) )


Espero ter colaborado.

Thiago Santiago
   - 23 abr 2010


Citação:

Nem precisa criar função, utilize assim:

#Código
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!

Wilson Paulista...!!!
   - 23 abr 2010

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.

Thiago Santiago
   - 23 abr 2010


Citação:

Nem precisa criar função, utilize assim:

#Código
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....

Wilson Paulista...!!!
   - 23 abr 2010

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.

Marcilio Marcon
   - 18 jun 2010

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