【问题标题】:MySQL error : sql_mode=only_full_group_byMySQL 错误:sql_mode=only_full_group_by
【发布时间】:2017-09-29 22:22:06
【问题描述】:

我有这个脚本,用于对动态结果进行简单投影

    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

但是出了点问题;因为我有这个错误:

1055 - SELECT 列表的表达式 #5 不在 GROUP BY 子句中,并且 包含非聚合列“mutuelle_bi.M.etat_bs”,它不是 功能上依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容

我该如何修改我的脚本来解决这个问题, 鉴于我不应该修改我的 sql server 的任何配置文件。我应该只写脚本

有什么建议吗??

【问题讨论】:

  • 你必须使用条件计数而不是子查询。
  • 不完全清楚您是否要保留only_full_group_by,它只能针对当前会话进行更改,但当然是一个有助于防止伪造结果集的功能。
  • 您可以在非聚合列中简单地使用ANY_VALUE() 函数。见:stackoverflow.com/a/40578865/439171

标签: mysql


【解决方案1】:

您也可以尝试禁用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';

为我工作。

【讨论】:

    【解决方案2】:

    我认为您只需要条件聚合:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2016-07-12
      相关资源
      最近更新 更多