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
- sign(data) mengembalikan