2017-02-15 1 views
1

je dois regrouper dans ma requête SUM de AMUNT champ selon WERKS, DATUM et UZEIT J'essaie de faire un groupe par sans succès j'ai une erreur comme ça: enter image description hereABAP Somme avec Grouper par dans des requêtes SELECT

Quel est le problème dans mon code?

C'est mon code ABAP:

DATA: gt_compr TYPE TABLE OF yrt_h_sales 
SELECT werks, extnb, datum, uzeit, sumvt, deprt, dpext, SUM(amunt) AS amunt 
    INTO  CORRESPONDING FIELDS OF TABLE @gt_compr 
    FROM  yrt_h_sales 
    WHERE  werks IN @so_werks 
    AND  datum IN @so_datum 
    GROUP BY werks, datum, uzeit. 

Après avoir corrigé et je l'ai fait, le code se présente comme suit:

SELECT werks, datum, uzeit, extnb, deprt, dpext, SUM(amunt) AS amunt 
    INTO  CORRESPONDING FIELDS OF TABLE @gt_compr 
    FROM  yrt_h_sales 
    WHERE  werks IN @so_werks 
    AND  datum IN @so_datum 
    GROUP BY werks, datum, uzeit, extnb, deprt, dpext. 

donc je n'ai pas l'erreur de compilation plus mais l'agrégation ne fonctionne toujours pas! J'ai un résultat de 43 ligne sans somme sur la colonne AMUNT

de post-scriptum c'est la structure de ma table: enter image description here

+1

Avez-vous essayé de spécifier les colonnes clés en premier? Apparemment, l'ordre «GROUP BY» fait [matter] (https://archive.sap.com/discussions/thread/1858633). –

+0

Oui j'ai essayé mais ça ne fonctionne pas, je pense que le problème est que l'autre colonne n'est pas dans le groupe par agrégation. Par exemple, si SELECT fait juste Werks, Datum UZEIT, SUM (Amunt) AS Amunt Il travaille – shmoolki

+1

S'il vous plaît ajouter la structure de table de 'yrt_h_sales' ou ouvrir la connexion du système boule de cristal afin que nous puissions prendre nous regarder .... – vwegert

Répondre

5

Votre observation est conforme à la documentation (et ce que je l'ai vu jusqu'à présent dans tout autre SGBDR j'ai travaillé):

Si les expressions sont agrégées utilisé, tous les identificateurs de colonnes qui ne sont pas inclus comme arguments d'une fonction d'agrégation doit être incluse après l'addition GROUP BY.

Prenez par exemple le champ temps UZEIT: Vous pouvez indiquer au système d'agréger (dans votre cas, résumer) tous les montants pour le même point dans le temps en l'ajoutant à la clause GROUP BY, ou vous pouvez appliquer une La fonction d'agrégat aussi (SUM n'aurait aucun sens ici, mais MIN pourrait), ou vous pourriez omettre le champ tout à fait. Vous pouvez pas laisser ballants autour sans autre précision - le terrain soit doit faire partie du nouveau jeu de clés créé par GROUP BY ou doit avoir une fonction d'agrégation qui lui est appliquée pour que le système sait quoi faire avec plusieurs ensembles de données pourrait se produire dans le groupe.

(Il s'agit d'une connaissance SQL basique et non ABAP.)

+5

Je voulais écrire "Amen" dans le commentaire, mais le stackoverflow ne me laisse pas en poster un de moins de 15 caractères. – Jagger