Permintaan maaf untuk gelar yang buruk, saya tidak yakin apa yang akan menjadi judul yang bagus untuk ini.
Ini saat ini (tampilan disederhanakan) data yang saya kerjakan
Agent | Commission
---------|------------
Smith | 100
Neo | 200
Morpheus | 300
Saya perlu menghitung persentase dari total komisi, masing-masing agen bertanggung jawab untuk itu.
Jadi, untuk Agen Smith, Persentase akan dihitung sebagai (Agent Smith's commission / Sum(commission)*100
Jadi, data saya yang diharapkan
Agent | Commission | % Commission
---------|---------------|---------------
Smith | 100 | 17
Neo | 200 | 33
Morpheus | 300 | 50
Saya memiliki fungsi mengembalikan komisi untuk setiap agen. Saya memiliki fungsi lain mengembalikan persentase sebagai (Commission/Sum(Commission))*100
. Masalahnya adalah bahwa Sum(commission)
akan dihitung untuk setiap baris, dan mengingat bahwa kueri ini akan dijalankan pada Gudang Data, kumpulan data akan lebih besar (saat ini, hanya di bawah 2.000 catatan) dan cukup jujur, pendekatan yang buruk (IMO ).
Apakah ada cara agar Sum(Commission)
tidak menghitung untuk setiap baris yang diambil?
Saya sedang memikirkan sesuatu pada baris permintaan 2 bagian, bagian pertama akan mengambilnya sum(commission)
menjadi variabel paket / tipe dan bagian kedua akan merujuk pada nilai pra-perhitungan ini, tapi saya tidak yakin bagaimana saya bisa mencapai ini.
Saya terbatas menggunakan SQL, dan saya menjalankan Oracle 10g R2.
sumber
Jawaban:
Anda sedang mencari
analytical function
ratio_to_reportsumber
Untuk mengembalikan semua agen dengan persentase komisi dan komisi mereka menggunakan fungsi analitik tanpa klausa analitik sehingga partisi berada di atas seluruh tabel:
Seperti yang saya pelajari dari René Nyffenegger (+1) fungsi ratio_to_report mengencangkan sintaks ini.
Menggunakan paket untuk menyimpan Komisi SUM akan melibatkan PL / SQL, yang secara khusus Anda kecualikan dengan menunjukkan bahwa Anda menginginkan solusi SQL, tetapi karena Anda sudah menggunakan fungsi, saya berasumsi niat Anda bukan untuk mengecualikan PL / SQL. Jika ini masalahnya, maka solusi paket mungkin membantu, tetapi itu tergantung pada cara kerja aplikasi Anda.
Ketika sesi Anda pertama kali dibuat dan memanggil fungsi dalam paket untuk mendapatkan komisi, ada panggilan implisit ke konstruktor paket yang bisa mendapatkan jumlah dan menyimpannya. Kemudian Anda bisa mereferensikan jumlah yang disimpan dalam fungsi komisi Anda dan hanya perlu melakukan jumlah sekali. Tentu saja begitu Anda memanggil fungsi dari sesi yang berbeda, jumlahnya akan dihitung lagi. Juga, memanggil fungsi untuk setiap agen akan jauh lebih efisien daripada memanggil satu pernyataan SQL untuk semua agen jika aplikasi Anda dapat dirancang dengan cara itu.
Anda mungkin ingin mempertimbangkan untuk mengubah fungsi Anda menjadi prosedur yang mengembalikan kursor untuk kueri di atas atau mungkin memiliki fungsi yang mengembalikan hasil kueri sebagai hasil pipelined yang ditetapkan.
Contoh data:
sumber
Anda dapat mencoba kueri berikut, jumlah (komisi) hanya akan dihitung sekali:
sumber
sumber