-1
votes

Problème d'utilisation du groupe par déclaration dans SQL

Je ne suis pas capable de grouper par table qui a toutes les valeurs identiques mais a deux rangées. Je ne comprends pas quelle est la raison derrière cela.

Après avoir exécuté cette requête, je reçois la table ci-dessous et je veux regrouper la table le long du lot_no. P>

ORA-00904: "LOT_COUNT": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 19 Column: 34


2 commentaires

Conseil d'aujourd'hui: utilisez toujours la syntaxe joindre . Plus facile à écrire (sans erreur), plus facile à lire et à entretenir, et plus facile à convertir en jointure extérieure si nécessaire!


Pouvez-vous également ajouter le schéma pour les 3 tables et ce que vous attendez comme schéma de la table de sortie?


3 Réponses :


0
votes

Votre erreur

SUM( (4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0)))) NON_ZERO_QTY


5 commentaires

J'ai essayé ce groupe par c.lot_no; Erreur: pas un groupe par expression


Si cela donne toujours la même erreur .. Je parie qu'il y a une autre colonne dans la requête sans être préfixée avec le bon alias. Mais je pense que vous rencontrez l'ora-00979: pas un groupe par expression


Je ne sais pas, je ne pouvais pas en trouver. La requête est la même que j'ai posté dans la question. Dans votre réponse, ce que vous avez mentionné à propos de la somme (). Pouvez-vous s'il vous plaît élaborer.


Si vous souhaitez regrouper sur lot_no, que voudriez-vous faire avec les valeurs dans "non_zero_qty" dans le groupe par .. Voulez-vous la valeur maximale? Voulez-vous la somme de toutes les valeurs? Il suffit d'ajouter une fonction de groupe autour de la somme de calcul déjà existante (......)


Mais cela change la valeur du compte que je ne veux pas.



0
votes

De ce que j'ai compris, vous ne pouvez pas groupe par sur lot_no ou lot_count et obtenir l'erreur d'identifiant. Cela peut être parce que vous n'utilisez pas la référence correcte de la colonne. Au lieu de cela, essayez d'utiliser la référence de table spécifique de la requête comme suit: xxx

se référer également: https://www.techonthenet.com/oracle/errors/ora00904.php Et, http://www.dba-oracle.com/t_ora_00918_column_ambigify_defined.htm < / p>

mise à jour:

Assurez-vous de regrouper des colonnes sélectionnées dans l'instruction SELECT.

après l'erreur: xxx

remarque la fonction max utilisée dans non_zero_qty instruction. Vous pouvez utiliser une autre fonction de ce type selon vos besoins. Il peut être somme (), min (), avg (), etc.


4 commentaires

J'ai essayé cela et je reçois une erreur: pas un groupe par expression et cette erreur est à (4- (décodage (C.qty1,0,1,1,0) + décodage (C.qty2,0,1,1,0) + décodage (C.qty3,0,1,0) + décodage (C.qty4,0,1,0))) non_zero_qty


Ouais. Si vous souhaitez regrouper sur non_zero_qty , puis ajoutez-le dans le groupe par déclaration. Sinon vous devez le regrouper. À cela, je veux dire que les fonctions de regroupement doivent être utilisées sur toutes les colonnes qui ne sont pas utilisées dans le groupe par déclaration.


J'ai édité le poteau afin que vous puissiez obtenir la juste idée de ce que je dis.


En fait, cela change la valeur du compte que je ne veux pas. Merci de votre aide.



0
votes

Il y a plusieurs problèmes dans votre requête.

  • groupe par c.lot_no code> est requis li>
  • Deuxième expression dans Sélectionnez CODE> DOIT être enveloppé dans Somme code> Fonction d'agrégat. (Modifiez l'expression de case code> relève en fonction de l'exigence) LI>
  • Utilisez toujours la norme ANSI-JOIN. (Recommandé) li> ul>

    Vérifiez la solution ci-dessous: P>

    SELECT 
      c.LOT_NO LOT_NO
    , SUM(CASE WHEN (4-(DECODE(c.qty1,0,1,0) + DECODE(c.qty2,0,1,0) + DECODE(c.qty3,0,1,0) + DECODE(c.qty4,0,1,0))) > 0 
            THEN 1 ELSE 0 END) NON_ZERO_QTY
    , count(c.lot_no) as LOT_COUNT
    FROM 
     CIM.QLDT_6001 a 
    JOIN CIM.PART_LOT_TBL b ON a.lot_no like '%' || b.old_lot_no || '%'
    JOIN CIM.JR_QTY_DETAIL_TBL c ON b.lot_no = c.lot_no 
    WHERE 
    c.lot_no = 'F-AJR-111026-603'
    AND a.val01 >= 100 
    GROUP BY c.LOT_NO
    


0 commentaires