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

Toán tử tổng hợp nhân trong SQL

Theo MUL, bạn có nghĩa là nhân lũy tiến các giá trị?

Ngay cả với 100 hàng có kích thước nhỏ (giả sử 10 giây), MUL (cột) của bạn sẽ làm tràn bất kỳ kiểu dữ liệu nào! Với khả năng sử dụng sai / ab cao như vậy và phạm vi sử dụng rất hạn chế, nó không cần phải là Chuẩn SQL. Như những người khác đã chỉ ra rằng có những cách toán học để giải quyết nó, cũng như có nhiều cách để thực hiện các phép tính phức tạp trong SQL chỉ bằng cách sử dụng các phương pháp tiêu chuẩn (và thông dụng).

Dữ liệu mẫu:

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 )

Để hoàn thiện, triển khai lõi 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)))
  • Cẩn thận khi sử dụng EXP / LOG trong SQL Server, hãy xem loại trả về http://msdn.microsoft.com/en-us/library/ms187592.aspx
  • Dạng POWER cho phép các số lớn hơn (sử dụng cơ số lớn hơn số Euler) và trong trường hợp kết quả tăng quá lớn để quay lại bằng POWER, bạn có thể chỉ trả về giá trị logarit và tính số thực bên ngoài Truy vấn SQL

* LOG (0) và LOG (-ve) là không xác định. Dưới đây chỉ trình bày cách xử lý điều này trong SQL Server. Tương đương có thể được tìm thấy cho các phiên bản SQL khác, sử dụng cùng một khái niệm

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

Thành phần:

  • lấy abs () của dữ liệu, nếu min là 0, nhân với bất kỳ thứ gì khác là vô ích, kết quả là 0
  • Khi dữ liệu bằng 0, NULLIF chuyển đổi nó thành null. Cả abs (), log () đều trả về null, khiến nó bị loại trừ khỏi sum ()
  • Nếu dữ liệu không phải là 0, abs cho phép chúng tôi nhân một số âm bằng phương pháp LOG - chúng tôi sẽ theo dõi số âm ở những nơi khác
  • Tìm ra dấu hiệu cuối cùng
    • dấu (dữ liệu) trả về 1 for >0 , 0 for 0-1 for <0 .
    • Chúng tôi thêm 0,5 nữa và lấy lại dấu (), vì vậy giờ đây chúng tôi đã phân loại cả 0 và 1 là 1 và chỉ -1 là -1.
    • lại sử dụng NULLIF để xóa khỏi COUNT () số 1, vì chúng tôi chỉ cần đếm các phủ định.
    • % 2 chống lại số lượng () số âm trả về một trong hai số đó
    • -> 1 nếu có một số lẻ là số âm
    • -> 0 nếu có một số chẵn là số âm
    • nhiều thủ thuật toán học hơn:chúng tôi lấy 1 hoặc 0 giảm 0,5, để ở trên trở thành
    • -> (0.5-1=-0.5 => làm tròn thành -1 ) nếu có một số lẻ các số âm
    • -> (0.5-0= 0.5 => làm tròn thành 1 ) nếu có một số chẵn là số âm
    • chúng tôi nhân 1 / -1 cuối cùng này với giá trị SUM-PRODUCT để có kết quả thực


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ràng buộc mặc định trong SQL Server là gì - Hướng dẫn sử dụng SQL Server / TSQL Phần 90

  2. Truy vấn hết thời gian chờ khi được thực thi từ web, nhưng cực nhanh khi được thực thi từ SSMS

  3. Sự khác biệt giữa #temptable và ## TempTable?

  4. Tại sao kết nối ODBC của tôi không thành công khi chạy tải SSIS trong Visual Studio nhưng không phải khi chạy cùng một gói sử dụng Tiện ích gói thực thi

  5. Cách chuyển đổi chuỗi thành ngày / giờ trong SQL Server bằng CAST ()