2010-09-09 3 views
0

i ont des problèmes avec following-instruction SQL (garni):« colonne XYZ doit être dans le groupe par » -> « ne peut pas regrouper par colonne globale »

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 

Il devrait me donner le montant/litre de éléments dans un délai spécial, mais j'obtiens l'erreur: column return must be in group by

Après avoir ajouté cette colonne: cannot group by aggregate column.

Ceci est fonctionnel, juste sans délai:

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

Comment puis-je ajouter le délai sans avoir une erreur?

+1

Quel RDBMS est-ce? Je n'ai pas vu la syntaxe 'GROUP BY 1,2,3' avant. –

+1

@Martin Smith: MySQL le permet apparemment. – gbn

+0

Est-ce que c'est juste moi ou vous situez une table qui n'est pas dans votre requête? Où est la jointure à vkdtab? – HLGEM

Répondre

2

Je vais essayer de changer le GROUP BY à GROUP BY nr, jjjjmm il correspond à vos colonnes non agrégées dans la clause SELECT. Soit vous GROUP BY ou SUM/MIN/DECOMPTE etc

Si cela est faux, l'agrégat est erronée, car elle ne permettrait pas la « exprimer votre ensemble en anglais simple » test

GROUP BY ordinal est un concept vil aussi, et devrait être abattu.

0

Ma réponse précédente était incorrecte - vous ne pouvez pas utiliser HAVING dans ce scénario

Vous avez juste besoin de mettre dans la clause 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

Que dois-je faire si je veux 2 calendriers? – Sven

+0

@BeatMe - J'ai mis à jour ma réponse – codingbadger

+1

um, devrait-il être Où jjjjmm ENTRE 201001 et 201009 OU jjjjmm ENTRE 201013 et 201020? – Beth

Questions connexes