sql >> Database teknologi >  >> RDS >> Sqlserver

Multipilcation Aggregate i SQL Server

Jeg ville ikke bruge skalarfunktion til denne type operation. Du ender med dårlig ydeevne, fordi forespørgselsoptimering skal køre det row-by-row uden nogen optimering. Mere info:SQL Server Functions: The Basics .

Anden med float/decimal og LOG/EXP du vil få tilnærmelsesfejl.

For det tredje at sende data til at fungere kan du bruge XML som:

CREATE FUNCTION dbo.udf_Mul(@value xml)
RETURNS FLOAT
AS
  BEGIN
      DECLARE @mul_value FLOAT;
      DECLARE @values AS TABLE ([value] float);

       INSERT INTO @values([value])
       SELECT [value] = t.c.value('(value)[1]', 'float')
      FROM @value.nodes('//row') AS t(c);


      SELECT @mul_value=CASE
               WHEN MinVal = 0 THEN 0
               WHEN Neg % 2 = 1 THEN -1 * Exp(ABSMult)
               ELSE Exp(ABSMult)
             END 
      FROM   (SELECT
             Sum(Log(Abs(NULLIF(Value, 0)))) AS ABSMult,
             Sum(Sign(CASE
                        WHEN Value < 0 THEN 1
                        ELSE 0
                      END))                  AS Neg,
             Min(Abs(Value))                 AS MinVal
              FROM   @values) foo

      RETURN @mul_value
  END 

og kalder det:

SELECT *
FROM Floats a
CROSS APPLY (SELECT dbo.udf_mul((SELECT [value]
                                 FROM Floats b
                                 WHERE a.id >= b.id
                                 FOR XML PATH, ROOT('root')))
             AS r) as cs(r);

SqlFiddleDemo

Output:

╔═════╦════════╦════════════════════╗
║ id  ║ value  ║         r          ║
╠═════╬════════╬════════════════════╣
║  1  ║     1  ║ 1                  ║
║  2  ║     3  ║ 3.0000000000000004 ║
║  3  ║     6  ║ 17.999999999999996 ║
║  4  ║     2  ║ 36                 ║
╚═════╩════════╩════════════════════╝



  1. Sådan eksporteres SQL Server-data fra tabel til en CSV-fil

  2. MySQL-forespørgsel giver dobbelt indtastningsfejl 1062

  3. Mysql bestille varer inden den seneste af 2 datoer

  4. Hvordan opdeles streng ved hjælp af skilletegn ved hjælp af T-SQL?