2017-02-17 61 views
0

我試圖構造一個查詢,選擇一個組名和具有最高銷售額的CD的名稱。該模式看起來像Postgres:錯誤:列必須出現在GROUP BY子句中或用於聚合函數中

組(組名,groupCode)

CD(cdTitle,numberSold,groupCode)

我已經建立了一個這樣的查詢:

SELECT mg.groupName, cd.cdTitle, MAX(cd.numberSold) as maxSold 
FROM musicalGroup mg, cd cd 
WHERE cd.groupCode = mg.groupCode 
GROUP BY mg.groupCode 

但我收到錯誤

ERROR: column "cd.cdtitle" must appear in the GROUP BY clause or be used in an aggregate function

如果我從SELE中刪除cd.cdtitle CT聲明我能夠得到正確的結果顯示

groupname... maxsold 
"Test"... 80000 
"Test2"... 81000 

等等。有沒有辦法讓我也從這個查詢中檢索CD名稱?

回答

1

一種方法是使用DENSE_RANK()來識別每個音樂組中的暢銷書。請注意,我選擇了DENSE_RANK()而不是ROW_NUMBER(),因爲前者將允許我們識別每個組合中出現最高銷售額的多名藝術家。

WITH cte AS (
    SELECT mg.groupName, 
      cd.cdTitle, 
      cd.numberSold, 
      DENSE_RANK() OVER (PARTITION BY cd.groupCode ORDER BY cd.numberSold DESC) dr 
    FROM musicalGroup mg 
    INNER JOIN cd cd 
     ON cd.groupCode = mg.groupCode 
) 
SELECT t.groupName, 
     t.cdTitle, 
     t.numberSold AS maxSold 
FROM cte t 
WHERE t.dr = 1 
+0

啊,我很抱歉。複製並粘貼查詢時發生錯誤。這個問題源於我試圖打印cd.cdTitle,而不是將代碼和名稱分組。我編輯了我的查詢來反映這一點。 – JCDJulian

+0

我用我認爲最有意義的方式更新了我的答案。 –

+0

嗯。這似乎很奇怪。它列出了每張CD上的藝術家最高銷售額,當時我想要的是每位藝術家銷量最高的一張CD。 – JCDJulian

相關問題