#1055 - SELECT 列表的表达式#2 不在 GROUP BY 子句中,并且包含非聚合列“osunemonitor.r.entry_date”

wea*_*nfo 3 mysql sql sum aggregate-functions left-join

我正在尝试按 ward_name 进行分组,这是我唯一需要分组的内容,但我收到此错误:

\ #1055 - SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列“osunemonitor.r.entry_date”,该列在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容

在我的查询中,如何使其仅分组ward_name

我的查询:

SELECT 
    pu.pu_ward_name, 
    entry_date,
    pu.o_code,
    pu.pu_ward_name,
    pu.pu_lga_name,
    pu.pu_code,
    pu.pu_ward_code,
    pu.pu_lga_code,
    pu.pu_voters_reg_count, 
    SUM(total_vote_cast) AS total_vote_cast,
    SUM(apc_total_vote) AS apc_total_vote,
    SUM(pdp_total_vote) AS pdp_total_vote,
    SUM(adp) AS adp, ward_name
FROM 
    post_election_info r 
    LEFT JOIN polling_unit pu ON r.ward_name = pu.pu_ward_name 
WHERE lga_name = 'BORIPE'
GROUP BY 
    pu.pu_ward_name
Run Code Online (Sandbox Code Playgroud)

GMB*_*GMB 6

每个非聚合列都必须出现在GROUP BY子句中。这是 ANSI SQL 中的一个标准,尽管古代版本的 MySQL 曾经对此很宽松。

想一想:如果您有SELECT一个列但没有GROUP BY这样做,RDBMS 将如何可靠地选择应显示组中的哪个值?

可能的解决方案包括:

  • 将所有其他非聚合列添加到子句GROUP BY
  • 在所有列周围使用聚合函数(除外)pu_ward_name。例如,MAX() 和 MIN() 是字符串友好的(与 SUM() 不同)。

第一个解决方案:

SELECT 
    pu.pu_ward_name, 
    entry_date,
    pu.o_code,
    pu.pu_lga_name,
    pu.pu_code,
    pu.pu_ward_code,
    pu.pu_lga_code,
    pu.pu_voters_reg_count, 
    SUM(total_vote_cast) AS total_vote_cast,
    SUM(apc_total_vote)  AS apc_total_vote,
    SUM(pdp_total_vote)  AS pdp_total_vote,
    SUM(adp) AS adp
FROM 
    post_election_info r 
    LEFT JOIN polling_unit pu ON r.ward_name = pu.pu_ward_name 
WHERE lga_name = 'BORIPE'
GROUP BY 
    pu.pu_ward_name, 
    entry_date,
    pu.o_code,
    pu.pu_lga_name,
    pu.pu_code,
    pu.pu_ward_code,
    pu.pu_lga_code,
    pu.pu_voters_reg_count
Run Code Online (Sandbox Code Playgroud)

第二个解决方案:

SELECT 
    pu.pu_ward_name, 
    MAX(entry_date)             AS entry_date,
    MAX(pu.o_code)              AS o_code,
    MAX(pu.pu_lga_name)         AS pu_lga_name,
    MAX(pu.pu_code)             AS pu_code,
    MAX(pu.pu_ward_code)        AS pu_ward_code,
    MAX(pu.pu_lga_code)         AS pu_lga_code,
    MAX(pu.pu_voters_reg_count) AS pu_voters_reg_count, 
    SUM(total_vote_cast)        AS total_vote_cast,
    SUM(apc_total_vote)         AS apc_total_vote,
    SUM(pdp_total_vote)         AS pdp_total_vote,
    SUM(adp)                    AS adp
FROM 
    post_election_info r 
    LEFT JOIN polling_unit pu ON r.ward_name = pu.pu_ward_name 
WHERE lga_name = 'BORIPE'
GROUP BY 
    pu.pu_ward_name
Run Code Online (Sandbox Code Playgroud)