must appear in the GROUP BY clause or be used in an aggregate function


今天在分組統計的時候pgsql報錯 must appear in the GROUP BY clause or be used in an aggregate function,在mysql里面是可以的,但是pgsql報錯,我去stackoverflow查詢了一下,發現有人遇到過和我一樣的問題,這是pgsql一個常見的聚合問題,在SQL3標准以前,選擇顯示的字段必須出現在在 GROUP BY 中。下面我把問題描述一下:

有一張表叫 makerar,表中記錄如下:

cname wmname avg
canada zoro 2.00
spain luffy 1.00
spain usopp 5.00

我想要查詢每個 cname 的最大 avg,按照mysql的寫法是

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;

在pgsql中報錯

ERROR:  column "makerar.wmname" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;

意思是 wmname 字段必須在 GROUP BY 中出現或者被用於聚合函數

於是我按照錯誤提示,把 wmname 字段加在 GROUP BY 后面,即

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;

得到的結果是

cname wmname avg
canada zoro 2.00
spain luffy 1.00
spain usopp 5.00

而我期望得到的結果是

cname wmname avg
canada zoro 2.00
spain usopp 5.00

解決方案有兩種,但是我只看懂了一種,於是把這一種記錄一下

大體思路是在子查詢中完成聚合,然后關聯包含你想顯示字段的表(這里是makerar自身)獲取字段(這里是wmname),所以sql就變成了下面這個樣子

SELECT   
  t.cname,
  m.wmname,
  t.max
FROM 
  (SELECT 
    cname,
    MAX(avg) AS max 
  FROM makerar
  GROUP BY cname) t
LEFT JOIN makerar m ON t.cname = m.cname AND t.max = m.avg;

參考鏈接

https://stackoverflow.com/questions/19601948/must-appear-in-the-group-by-clause-or-be-used-in-an-aggregate-function#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM