2016-12-15 12 views
5

tôi có kịch bản này, nơi tôi đang sử dụng để làm một dự báo đơn giản cho một kết quả độnglỗi 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 

nhưng họ gặp khó khăn; như tôi có lỗi này:

1055 - Biểu hiện # 5 trong danh sách SELECT không có trong mệnh đề GROUP BY và chứa nonaggregated cột 'mutuelle_bi.M.etat_bs' mà không phải là chức năng phụ thuộc vào các cột trong mệnh đề GROUP BY ; đây là không tương thích với sql_mode = only_full_group_by

enter image description here

Làm thế nào tôi có thể sửa đổi kịch bản của tôi bằng cách này để giải quyết vấn đề này, cho rằng tôi không nên thay đổi bất kỳ tập tin cấu hình của máy chủ sql của tôi . và tôi chỉ nên viết các tập lệnh

Bất kỳ đề xuất nào ??

+0

Bạn phải sử dụng tính có điều kiện thay vì truy vấn phụ. – Shadow

+0

Nó không phải là hoàn toàn rõ ràng cho dù bạn wan để giữ 'only_full_group_by', mà có thể được thay đổi chỉ cho phiên hiện tại nhưng tất nhiên là một tính năng để giúp ngăn chặn bộ kết quả không có thật. –

+0

Bạn có thể đơn giản sử dụng hàm 'ANY_VALUE()' trong cột không được phân tách. Xem: http://stackoverflow.com/a/40578865/439171 –

Trả lời

3

Tôi nghĩ rằng bạn chỉ muốn tập hợp có điều kiện:

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

Bạn cũng có thể thử để vô hiệu hóa các thiết lập 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'; 

Làm việc cho tôi.