2016-12-15 18 views
5

mam ten skrypt, gdzie jestem przyzwyczajony zrobić prostą projekcję dla dynamicznego wynikuBłąd MySQL: sql_mode = only_full_group_by

SELECT 
    M.nom_utilisateur, 
    SUM(M.montant_bulletin) as Montant_Total_BS, 
    SUM(M.montant_payer ) as Montant_Total_payer, 
    COUNT(M.ref_bs) as nbr_bs_total, 

(SELECT COUNT(*) FROM mutuelle_bi.`Mutuelle` WHERE nom_utilisateur = M.nom_utilisateur AND (M.nom_assurence = "Star" AND M.etat_bs = "Remboursé")) as nbr_bs_total_payer, 

(SELECT COUNT(*) FROM mutuelle_bi.`Mutuelle` WHERE nom_utilisateur = M.nom_utilisateur AND (M.nom_assurence = "Star" AND M.etat_bs = "Non remboursé")) as nbr_bs_non_payer, 

(SELECT COUNT(*) FROM mutuelle_bi.`Mutuelle` WHERE nom_utilisateur = M.nom_utilisateur AND (M.nom_assurence = "Star" AND M.etat_bs = "En cours")) as nbr_bs_en_cours, 

(SELECT COUNT(*) FROM mutuelle_bi.`Mutuelle` WHERE nom_utilisateur = M.nom_utilisateur AND (M.nom_assurence = "Star" AND M.etat_bs = "Nouveau")) as nbr_bs_nouveau 
    FROM mutuelle_bi.`Mutuelle` M 
    WHERE M.nom_assurence = "Star" 
    GROUP BY M.nom_utilisateur 

ale coś się nie uda; jak mam ten błąd:

1055 - Expression 5 z listy SELECT nie jest w klauzuli GROUP BY i zawiera nonaggregated kolumnie „mutuelle_bi.M.etat_bs”, które nie jest funkcjonalnie zależne od kolumn w klauzuli GROUP BY ; to niezgodna z sql_mode = only_full_group_by

enter image description here

Jak mogę zmienić mój skrypt na drodze do rozwiązania tego problemu, podano, że nie powinno się modyfikować dowolny plik konfiguracyjny z moim serwerem sql . i powinienem pisać tylko skrypty

Wszelkie sugestie?

+0

Musisz użyć liczenia warunkowego zamiast podkwerend. – Shadow

+0

Nie jest całkowicie jasne, czy chcesz zachować 'only_full_group_by', które można zmienić tylko dla bieżącej sesji, ale oczywiście jest to funkcja, która pomaga zapobiegać fałszywym wynikom. –

+0

Możesz łatwo użyć funkcji 'ANY_VALUE()' w niezagregowanej kolumnie. Zobacz: http://stackoverflow.com/a/40578865/439171 –

Odpowiedz

3

myślę po prostu chcesz agregacji warunkową:

SELECT M.nom_utilisateur, 
     SUM(M.montant_bulletin) as Montant_Total_BS, 
     SUM(M.montant_payer) as Montant_Total_payer, 
     SUM(M.etat_bs = 'Remboursé') as nbr_bs_total_payer, 
     SUM(M.etat_bs = 'Non remboursé') as nbr_bs_non_payer, 
     SUM(M.etat_bs = 'En cours') as nbr_bs_en_cours, 
     SUM(M.etat_bs = 'Nouveau') as nbr_bs_nouveau 
FROM mutuelle_bi.`Mutuelle` M 
WHERE M.nom_assurence = 'Star' 
GROUP BY M.nom_utilisateur; 
7

Można także spróbować wyłączyć ustawienie only_full_group_by:

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 

pracował dla mnie.