首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL GROUP BY 報錯?牢記「非聚合欄位必須出現在 GROUP BY 中」鐵律

     編輯:程式設計綜合問答

執行建表查詢時拋出錯誤,經典案例教你搞懂 GROUP BY 的核心規則,避開「非聚合欄位」陷阱。

錯誤 SQL 重現

DROP TABLE IF EXISTS fz_yn3;
CREATE TABLE fz_yn3 AS
SELECT z.user_id, z.nick, z.appkey, z.company, z.plan,
       b.cust_id, b.shop_cat_name, b.gmt_create, b.seller_star_name, b.shop_start
FROM fz_yn2 z
LEFT OUTER JOIN (
    SELECT DISTINCT cust_id, nick_name, shop_cat_name, gmt_create, seller_star_name, shop_start
    FROM ad_p4p_dw.dim_p4p_customer_extra WHERE ds=20141031
) b ON z.nick = b.nick_name
GROUP BY z.user_id, z.nick, z.appkey, z.company, z.plan;

錯誤根因

SELECT 列表中包含未參與 GROUP BY 且未使用聚合函數的欄位(如 b.cust_id、b.shop_cat_name 等)。MySQL 在 ONLY_FULL_GROUP_BY 模式下(5.7+ 預設開啟)會嚴格檢查此規則。

修正方案

  1. 將所有非聚合欄位加入 GROUP BY(若業務允許)。
  2. 對非分組欄位套用聚合函數,如 MAX(b.cust_id)、ANY_VALUE(b.shop_cat_name)。
  3. 改用子查詢/關聯查詢先聚合再關聯,邏輯更清晰。

修正範例(採用 ANY_VALUE)

SELECT z.user_id, z.nick, z.appkey, z.company, z.plan,
       ANY_VALUE(b.cust_id) AS cust_id,
       ANY_VALUE(b.shop_cat_name) AS shop_cat_name,
       ANY_VALUE(b.gmt_create) AS gmt_create,
       ANY_VALUE(b.seller_star_name) AS seller_star_name,
       ANY_VALUE(b.shop_start) AS shop_start
FROM fz_yn2 z
LEFT JOIN (
    SELECT DISTINCT cust_id, nick_name, shop_cat_name, gmt_create, seller_star_name, shop_start
    FROM ad_p4p_dw.dim_p4p_customer_extra WHERE ds=20141031
) b ON z.nick = b.nick_name
GROUP BY z.user_id, z.nick, z.appkey, z.company, z.plan;

核心口訣:SELECT 後的欄位,要么在 GROUP BY 裡,要么包在聚合函數裡——沒有第三種選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved