msgstr "столбец XYZ должен быть в группе по" -> "не может группировать по совокупному столбцу" - PullRequest
0 голосов
/ 09 сентября 2010

У меня проблемы со следующим SQL-оператором (обрезанным):

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

Как я могу добавить таймфрейм без ошибки?

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

Я бы попробовал изменить GROUP BY на GROUP BY nr, jjjjmm, чтобы он соответствовал вашим неагрегированным столбцам в предложении SELECT. Вы или GROUP BY или SUM / MIN / COUNT и т. Д.

Если это не так, то агрегат неправильный, потому что он не пройдет тест «выразить агрегат на простом английском»

GROUP BY ordinal также является мерзким понятием и должно быть застрелено.

0 голосов
/ 09 сентября 2010

Мой предыдущий ответ был неверным - вы не можете использовать 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
...