2010-09-09 131 views
0

我有下面的SQL語句(修剪)麻煩:「列XYZ必須在GROUP BY」 - >「不能GROUP BY聚合列」

SELECT nr, 
    (CASE WHEN 
     SUM(vkdtab.amount*liter)<>0 AND 
     jjjjmm BETWEEN 201001 and 201009 
    THEN SUM(net)/SUM(vkdtab.amount*liter) 
    ELSE 0 END) as return 
FROM tab 
GROUP BY 1,2,3 

應該給我量/升項目在一個特殊的時間範圍內,但我得到的錯誤:column return must be in group by

在我添加該列後:cannot group by aggregate column

這是功能性的,只是沒有時間表:

CASE WHEN 
    SUM(vkdtab.amount*liter)<>0 
THEN SUM(net)/SUM(vkdtab.amount*liter) 
ELSE 0 END 

如何我可以添加的時間表沒有得到一個錯誤?

+1

這是什麼RDBMS?我以前沒有看過「GROUP BY 1,2,3」的語法。 – 2010-09-09 12:44:30

+1

@Martin Smith:MySQL顯然允許它。 – gbn 2010-09-09 12:46:38

+0

它只是我還是你正在查詢一個不在你的查詢中的表? vkdtab連接在哪裏? – HLGEM 2010-09-09 13:26:21

回答

2

我會嘗試改變GROUP BY到GROUP BY nr, jjjjmm所以與SELECT子句中的未聚合列匹配。你要麼GROUP BY或SUM/MIN/COUNT等

如果這是錯誤的,那麼該聚集是錯誤的,因爲它會失敗的「表達簡單的英語你總」測試

GROUP BY ordinal是卑鄙的概念也和應該被槍殺。

0

我以前的答案是不正確的 - 你不能用HAVING在這種情況下

你只需要把在where子句中:

SELECT nr, 
    (CASE WHEN 
     SUM(vkdtab.amount*liter)<>0 AND 
     jjjjmm BETWEEN 201001 and 201009 
    THEN SUM(net)/SUM(vkdtab.amount*liter) 
    ELSE 0 END) as return 
FROM tab 

Where jjjjmm BETWEEN 201001 and 201009 
And jjjjmm BETWEEN 201013 and 201020 

GROUP BY CASE WHEN 
    SUM(vkdtab.amount*liter)<>0 
THEN SUM(net)/SUM(vkdtab.amount*liter) 
ELSE 0 END 
+0

如果我想要2個時間範圍,該怎麼辦? – Sven 2010-09-09 12:50:33

+0

@BeatMe - 我已經更新了我的回答 – codingbadger 2010-09-09 12:56:50

+1

這個,它應該在哪裏,在20113年和201009之間,還是在2010年和2010年之間? – Beth 2010-09-09 13:06:46