Masz aggregate fanout issue
. Dzieje się tak, gdy tabela podstawowa w zapytaniu wybierającym ma mniej wierszy niż tabela dodatkowa, z którą jest połączona. Wynikiem połączenia są zduplikowane wiersze. Tak więc po zastosowaniu funkcji agregujących działają one na dodatkowych wierszach.
Tutaj podstawowa tabela odnosi się do tej, w której stosowane są funkcje agregujące. W twoim przykładzie
* SUM(matters.fee)
>> agregacja na tabeli matters
.
* SUM(advicetime*advicefee)
>> agregacja w tabeli actions
* fixedfee='Y'
>> warunek where w tabeli matters
Aby uniknąć problemu z fanoutami:
* Zawsze stosuj agregacje do najbardziej szczegółowej tabeli w łączeniu.
* O ile dwie tabele nie mają relacji jeden-do-jednego, nie stosuj funkcji agregujących do pól z obie tabele.
* Uzyskaj agregacje oddzielnie za pomocą różnych podzapytań, a następnie połącz wynik. Można to zrobić w instrukcji SQL lub możesz wyeksportować dane, a następnie to zrobić.
Zapytanie 1:
SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y'
Zapytanie 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
nie cierpieć z powodu fanoutu. W tym momencie możesz wyeksportować je oba i poradzić sobie z wynikiem w php. Możesz też połączyć je w 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
Wreszcie SUM
nie przyjmuje słowa kluczowego DISTINCT
. DISTINCT
jest dostępny tylko dla COUNT
i GROUP_CONCAT
funkcje agregujące. Poniżej znajduje się fragment nieprawidłowego SQL
SUM(DISTINCT matters.fee) AS totfixed