2010-09-09 178 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