none
Função similar a função MULT do EXCEL RRS feed

  • Pergunta

  • Bom dia,

    No SQL Server existe alguma função similar ao MULT do Excel? Ex: =Mult(a1:a7) que também é igual a =a1*a2*a3*a4*a5*a6*a7

    Obrigado,

    • Movido Gustavo Maia Aguiar quarta-feira, 1 de setembro de 2010 17:12 (De:SQL Server - Desenvolvimento Geral)
    quarta-feira, 1 de setembro de 2010 12:51

Respostas

  • Riley,

    Acredito que não, mas você poderia criar um loop para realizar o cálculo, armazenando estes valores em uma tabela temporária, fazendo a varredura dos valores dentro da table.

    Veja se este exemplo ajuda:

    Create Table #T1 
    (Codigo Int Identity(1,1),
     Valor Int)
     
    Insert Into #T1 Values (10)
    Insert Into #T1 Values (20)
    Insert Into #T1 Values (30)
    Insert Into #T1 Values (40)
    Insert Into #T1 Values (50)
    Insert Into #T1 Values (60)
    
    Select * from #T1
    Declare @Contador Int,
        @Valor Int
    
    Set @Contador=1
    Set @Valor=0
    
    While @Contador <= (Select COUNT(Codigo) from #T1)
    Begin
     
     If @Contador=1
     Set @Valor=(Select Valor From #T1 Where Codigo = @Contador)
     Else
     Set @Valor=@Valor*(Select Valor From #T1 Where Codigo = @Contador)
     
     Set @Contador=@Contador+1 
    
    End
    
    Select @Valor As 'Resultado'
    
    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    • Marcado como Resposta Jason DBA Jr segunda-feira, 6 de setembro de 2010 12:59
    quinta-feira, 2 de setembro de 2010 19:12
  • Srs.... Apenas um pitaco antes de sair para o feriado... Fazer esse tipo de soma/multiplicação ou como usamos aqui concatenação dá para fazer sem Loop:

    /* Multiplicação dos registros */

    Declare @Valor Int

    Set @Valor = 1

    Select @Valor = @Valor * Valor From #T1

    Select @Valor As 'Resultado'

     

    E caso for Fatoração, dá para usar a spt_values tambem sem Loop.

    /* Fatoração */

    Declare @n int, @result float

    Select @n = 7,@result=1

    Select @result = @result * number
      From Master..spt_values
     Where Type='p'
       And Number Between 1 And @n

    Select @result

     


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    • Marcado como Resposta Jason DBA Jr segunda-feira, 6 de setembro de 2010 12:59
    sexta-feira, 3 de setembro de 2010 17:59
  • Bom Dia,

    O SQL Server não possui algo nativo em T-SQL. Você pode fazer isso com UDA (User Defined Aggregates) ou com CLR. Já demonstrei alguns cenários com essas técnicas em:

    Cálculos financeiros, consultas SQL eo mercado de ações - Parte I
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!361.entry

    Cálculos financeiros, consultas SQL eo mercado de ações - Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!362.entry

    Cálculos financeiros, consultas SQL eo mercado de ações - Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!365.entry

    Com o T-SQL puro, teremos que recorrer aos raciocínios da matemática e "achar" outro caminho. Segue exemplo:

    DECLARE @T TABLE (ID INT IDENTITY(1,1), VALOR INT)
    INSERT INTO @T (VALOR) VALUES (1)
    INSERT INTO @T (VALOR) VALUES (3)
    INSERT INTO @T (VALOR) VALUES (6)
    INSERT INTO @T (VALOR) VALUES (2)
    INSERT INTO @T (VALOR) VALUES (4)
    -- Multiplicação
    SELECT POWER(10.00,SUM(LOG10(VALOR))) As MULT FROM @T
    -- Multiplicação Acumulada
    SELECT VALOR,
     (SELECT POWER(10.00,SUM(LOG10(TInt.VALOR))) As MULT FROM @T As TInt
     WHERE TOut.ID >= TInt.ID) As MultAcumulada
    FROM @T As TOut
    

    Para explicações mais detalhadas bem como todas as demais alternativas, a leitura dos artigos é recomendada

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar domingo, 5 de setembro de 2010 14:32
    • Marcado como Resposta Jason DBA Jr segunda-feira, 6 de setembro de 2010 12:58
    domingo, 5 de setembro de 2010 14:32

Todas as Respostas

  • Riley,

    Acredito que não, mas você poderia criar um loop para realizar o cálculo, armazenando estes valores em uma tabela temporária, fazendo a varredura dos valores dentro da table.

    Veja se este exemplo ajuda:

    Create Table #T1 
    (Codigo Int Identity(1,1),
     Valor Int)
     
    Insert Into #T1 Values (10)
    Insert Into #T1 Values (20)
    Insert Into #T1 Values (30)
    Insert Into #T1 Values (40)
    Insert Into #T1 Values (50)
    Insert Into #T1 Values (60)
    
    Select * from #T1
    Declare @Contador Int,
        @Valor Int
    
    Set @Contador=1
    Set @Valor=0
    
    While @Contador <= (Select COUNT(Codigo) from #T1)
    Begin
     
     If @Contador=1
     Set @Valor=(Select Valor From #T1 Where Codigo = @Contador)
     Else
     Set @Valor=@Valor*(Select Valor From #T1 Where Codigo = @Contador)
     
     Set @Contador=@Contador+1 
    
    End
    
    Select @Valor As 'Resultado'
    
    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    • Marcado como Resposta Jason DBA Jr segunda-feira, 6 de setembro de 2010 12:59
    quinta-feira, 2 de setembro de 2010 19:12
  • Riley, Esqueci de perguntar uma coisa, você esta querendo trabalhar com fatores numéricos?
    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    quinta-feira, 2 de setembro de 2010 19:17
  • Srs.... Apenas um pitaco antes de sair para o feriado... Fazer esse tipo de soma/multiplicação ou como usamos aqui concatenação dá para fazer sem Loop:

    /* Multiplicação dos registros */

    Declare @Valor Int

    Set @Valor = 1

    Select @Valor = @Valor * Valor From #T1

    Select @Valor As 'Resultado'

     

    E caso for Fatoração, dá para usar a spt_values tambem sem Loop.

    /* Fatoração */

    Declare @n int, @result float

    Select @n = 7,@result=1

    Select @result = @result * number
      From Master..spt_values
     Where Type='p'
       And Number Between 1 And @n

    Select @result

     


    Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco
    • Marcado como Resposta Jason DBA Jr segunda-feira, 6 de setembro de 2010 12:59
    sexta-feira, 3 de setembro de 2010 17:59
  • Fausto,

    Muito obrigado pela dica, eu não conhecia a spt_values!!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    domingo, 5 de setembro de 2010 02:27
  • Bom Dia,

    O SQL Server não possui algo nativo em T-SQL. Você pode fazer isso com UDA (User Defined Aggregates) ou com CLR. Já demonstrei alguns cenários com essas técnicas em:

    Cálculos financeiros, consultas SQL eo mercado de ações - Parte I
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!361.entry

    Cálculos financeiros, consultas SQL eo mercado de ações - Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!362.entry

    Cálculos financeiros, consultas SQL eo mercado de ações - Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!365.entry

    Com o T-SQL puro, teremos que recorrer aos raciocínios da matemática e "achar" outro caminho. Segue exemplo:

    DECLARE @T TABLE (ID INT IDENTITY(1,1), VALOR INT)
    INSERT INTO @T (VALOR) VALUES (1)
    INSERT INTO @T (VALOR) VALUES (3)
    INSERT INTO @T (VALOR) VALUES (6)
    INSERT INTO @T (VALOR) VALUES (2)
    INSERT INTO @T (VALOR) VALUES (4)
    -- Multiplicação
    SELECT POWER(10.00,SUM(LOG10(VALOR))) As MULT FROM @T
    -- Multiplicação Acumulada
    SELECT VALOR,
     (SELECT POWER(10.00,SUM(LOG10(TInt.VALOR))) As MULT FROM @T As TInt
     WHERE TOut.ID >= TInt.ID) As MultAcumulada
    FROM @T As TOut
    

    Para explicações mais detalhadas bem como todas as demais alternativas, a leitura dos artigos é recomendada

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    • Sugerido como Resposta Gustavo Maia Aguiar domingo, 5 de setembro de 2010 14:32
    • Marcado como Resposta Jason DBA Jr segunda-feira, 6 de setembro de 2010 12:58
    domingo, 5 de setembro de 2010 14:32
  • Caras,

    Obrigado.

    segunda-feira, 6 de setembro de 2010 12:58