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

Operator agregat perkalian dalam SQL

Dengan MUL maksud Anda perkalian progresif nilai?

Bahkan dengan 100 baris berukuran kecil (katakanlah 10 detik), MUL(kolom) Anda akan membanjiri semua tipe data! Dengan kemungkinan kesalahan/penyalahgunaan yang tinggi, dan cakupan penggunaan yang sangat terbatas, itu tidak perlu menjadi Standar SQL. Seperti yang telah ditunjukkan oleh orang lain, ada cara matematis untuk menyelesaikannya, sama seperti ada banyak cara untuk melakukan perhitungan rumit di SQL hanya dengan menggunakan metode standar (dan umum digunakan).

Contoh data:

Column
1
2
4
8

COUNT : 4 items (1 for each non-null)
SUM   : 1 + 2 + 4 + 8 = 15
AVG   : 3.75 (SUM/COUNT)
MUL   : 1 x 2 x 4 x 8 ? ( =64 )

Untuk kelengkapan, implementasi inti Oracle, MSSQL, MySQL *

Oracle : EXP(SUM(LN(column)))   or  POWER(N,SUM(LOG(column, N)))
MSSQL  : EXP(SUM(LOG(column)))  or  POWER(N,SUM(LOG(column)/LOG(N)))
MySQL  : EXP(SUM(LOG(column)))  or  POW(N,SUM(LOG(N,column)))
  • Berhati-hatilah saat menggunakan EXP/LOG di SQL Server, perhatikan jenis pengembalian http://msdn.microsoft.com/en-us/library/ms187592.aspx
  • Bentuk POWER memungkinkan untuk bilangan yang lebih besar (menggunakan basis yang lebih besar dari bilangan Euler), dan dalam kasus di mana hasilnya tumbuh terlalu besar untuk mengembalikannya menggunakan POWER, Anda dapat mengembalikan nilai logaritma saja dan menghitung bilangan sebenarnya di luar Kueri SQL

* LOG(0) dan LOG(-ve) tidak terdefinisi. Di bawah ini hanya menunjukkan bagaimana menangani ini di SQL Server. Setara dapat ditemukan untuk rasa SQL lainnya, menggunakan konsep yang sama

create table MUL(data int)
insert MUL select 1 yourColumn union all
           select 2 union all
           select 4 union all
           select 8 union all
           select -2 union all
           select 0

select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
       EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
     * round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
       END
from MUL

Bahan:

  • mengambil abs() data, jika min adalah 0, dikalikan dengan apa pun yang sia-sia, hasilnya adalah 0
  • Saat data bernilai 0, NULLIF mengonversinya menjadi null. Abs(), log() keduanya mengembalikan null, menyebabkannya dikecualikan dari sum()
  • Jika data bukan 0, abs memungkinkan kita mengalikan bilangan negatif menggunakan metode LOG - kita akan melacak negatifnya di tempat lain
  • Mengerjakan tanda terakhir
    • sign(data) mengembalikan 1 for >0 , 0 for 0 dan -1 for <0 .
    • Kami menambahkan 0,5 lagi dan mengambil tanda() lagi, jadi sekarang kami telah mengklasifikasikan 0 dan 1 keduanya sebagai 1, dan hanya -1 sebagai -1.
    • sekali lagi gunakan NULLIF untuk menghapus dari COUNT() 1, karena kita hanya perlu menghitung negatifnya.
    • % 2 terhadap count() dari angka negatif kembali baik
    • --> 1 jika ada bilangan ganjil negatif
    • --> 0 jika ada bilangan genap negatif
    • trik matematika lainnya:kita kurangi 1 atau 0 0,5, sehingga di atas menjadi
    • --> (0.5-1=-0.5 =>bulat ke -1 ) jika ada bilangan ganjil negatif
    • --> (0.5-0= 0.5 =>bulat ke 1 ) jika ada bilangan negatif genap
    • kami mengalikan 1/-1 akhir ini dengan nilai SUM-PRODUCT untuk hasil yang sebenarnya


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan objek yang rusak di SQL Server

  2. KOTAK () Contoh di SQL Server

  3. INSERT INTO @TABLE EXEC @query dengan SQL Server 2000

  4. Cara Mengirim Email dari SQL Server (T-SQL)

  5. @@IDENTITY, SCOPE_IDENTITY(), OUTPUT dan metode lain untuk mengambil identitas terakhir