Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Multpilcation Aggregate trong Sql Server

Tôi sẽ không sử dụng hàm vô hướng cho loại hoạt động này. Kết quả là bạn có hiệu suất kém vì trình tối ưu hóa truy vấn cần chạy nó row-by-row mà không có bất kỳ tối ưu hóa nào. Thông tin thêm: SQL Server Functions: The Basics .

Thứ hai với float / decimal và LOG/EXP bạn sẽ nhận được lỗi ước lượng.

Thứ ba để chuyển dữ liệu cho chức năng, bạn có thể sử dụng XML như:

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 

và gọi nó là:

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

Đầu ra:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đếm không có hàng nào được trả về bởi một truy vấn chọn

  2. Tên cột FirstName được chỉ định trong toán tử PIVOT xung đột với tên cột hiện có trong đối số PIVOT

  3. Thủ tục được lưu trữ để phân tích cú pháp một chuỗi

  4. Đặt hồ sơ công khai mặc định cho thư cơ sở dữ liệu (SSMS)

  5. Ví dụ về yêu cầu SQL Server 2008 về cách tạo con trỏ để lặp qua các bản ghi