Anda mengalami aggregate fanout issue
. Ini terjadi setiap kali tabel utama dalam kueri pemilihan memiliki lebih sedikit baris daripada tabel sekunder yang digabungkan. Gabung menghasilkan baris duplikat. Jadi, ketika fungsi agregat diterapkan, mereka bertindak pada baris tambahan.
Di sini tabel utama mengacu pada tabel di mana fungsi agregat diterapkan. Dalam contoh Anda,
* SUM(matters.fee)
>> agregasi pada tabel matters
.
* SUM(advicetime*advicefee)
>> agregasi pada tabel actions
* fixedfee='Y'
>> di mana kondisi pada tabel matters
Untuk menghindari masalah fanout:
* Selalu terapkan agregat ke tabel paling granular dalam gabungan.
* Kecuali dua tabel memiliki hubungan satu-ke-satu, jangan terapkan fungsi agregat pada bidang dari kedua tabel.
* Dapatkan agregat Anda secara terpisah melalui subkueri yang berbeda, lalu gabungkan hasilnya. Ini dapat dilakukan dalam pernyataan SQL, atau Anda dapat mengekspor data lalu melakukannya.
Pertanyaan 1:
SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y'
Pertanyaan 2:
SELECT SUM(actions.advicetime*actions.advicefee) AS totbills
FROM matters
JOIN actions ON matters.matterid = actions.matterid
WHERE matters.fixedfee = 'Y'
Query 1
&Query 2
tidak menderita fanout. Pada titik ini Anda dapat mengekspor keduanya dan menangani hasilnya di php. Atau Anda dapat menggabungkannya dalam SQL:
SELECT query_2.totbills, query_1.totfixed
FROM (SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y') query_1,
(SELECT SUM(actions.advicetime*actions.advicefee) AS totbills
FROM matters
JOIN actions ON matters.matterid = actions.matterid
WHERE matters.fixedfee = 'Y') query_2
Terakhir, SUM
tidak menggunakan kata kunci DISTINCT
. DISTINCT
hanya tersedia untuk COUNT
dan GROUP_CONCAT
fungsi agregat. Berikut ini adalah bagian dari SQL yang tidak valid
SUM(DISTINCT matters.fee) AS totfixed