Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Agregat Multipilcation di Sql Server

Saya tidak akan menggunakan fungsi skalar untuk jenis operasi ini. Anda berakhir dengan kinerja yang buruk karena pengoptimal kueri perlu menjalankannya row-by-row tanpa ada optimalisasi. Info lebih lanjut:SQL Server Functions: The Basics .

Kedua dengan float/desimal dan LOG/EXP Anda akan mendapatkan kesalahan perkiraan.

Ketiga untuk melewatkan data agar berfungsi, Anda dapat menggunakan XML seperti:

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 

dan menyebutnya:

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

Keluaran:

╔═════╦════════╦════════════════════╗
║ 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. SQL Server 2008 mengungkapkan kinerja di lingkungan produksi?

  2. Bagaimana cara menentukan kunci utama untuk tabel di SQL Server?

  3. Cara Mendefinisikan Ulang Kolom yang Dikembalikan oleh Prosedur Tersimpan di SQL Server

  4. Tetapkan lokasi kerja secara acak dan setiap lokasi tidak boleh melebihi jumlah karyawan yang ditunjuk

  5. Memaksa code-first untuk selalu menginisialisasi database yang tidak ada?