執行建表查詢時拋出錯誤,經典案例教你搞懂 GROUP BY 的核心規則,避開「非聚合欄位」陷阱。
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+ 預設開啟)會嚴格檢查此規則。
MAX(b.cust_id)、ANY_VALUE(b.shop_cat_name)。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 裡,要么包在聚合函數裡——沒有第三種選擇。