sous - requête SQL - Zend framework

fr2i
Invité n'ayant pas de compte PHPfrance

12 nov. 2015, 16:22

Bonjour à tous,

J'ai un problème avec une sous requête de ce type :

Code : Tout sélectionner

SELECT EMETTEUR.ID_GE as IDCLIENT, EMETTEUR.LB_GE as CLIENT, sum(emet_fic_charge.nb_trans) as COLLECTES, SUM(emet_fic_charge.nb_cab_val) as DIFF_VAL, sum(emet_fic_charge.nb_cab_err) as DIFF_ERR, sum(emet_fic_charge.nb_doublon_strict) as DIFF_DBLON, PLIS_INTER.PLIS_INTER FROM EMETTEUR, emet_fic_charge, (SELECT SUM(nb_cab_inter_dif) as PLIS_INTER FROM fichier_dif, emetteur WHERE fichier_dif.id_ge = emetteur.id_ge AND ( EMETTEUR.ID_GE = :ad_ge OR :ad_ge = 0) AND ( to_date(dt_dif) >= to_date(:ad_date_deb, 'dd/MM/yy') ) AND ( to_date(dt_dif) <= to_date(:ad_date_fin, 'dd/MM/yy'))) as PLIS_INTER WHERE (emetteur.id_ge = emet_fic_charge.id_ge)AND ( EMETTEUR.ID_GE = :ad_ge OR :ad_ge = 0) AND ( to_date(emet_fic_charge.dt_chargement) >= to_date(:ad_date_deb, 'dd/MM/yy') ) AND ( to_date(emet_fic_charge.dt_chargement) <= to_date(:ad_date_fin, 'dd/MM/yy') ) GROUP BY EMETTEUR.ID_GE, EMETTEUR.LB_GE, PLIS_INTER.PLIS_INTER ORDER BY EMETTEUR.LB_GE;
J'utilise ceci pour exécuter cette requête:

Code : Tout sélectionner

$resultStmt = $this->getAdapter()->query( $this->_req, $parametre_de_la_requete2 ); $res = $resultStmt->fetchAll ();
et j'ai cette erreur qui affiche :
SQLSTATE[HY000]: General error: 979 OCIStmtExecute: ORA-00979: N'est pas une expression GROUP BY
(ext\pdo_oci\oci_statement.c:146)
Pouvez vous m'aider ?

Merci d'avance !!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 nov. 2015, 20:20

Bonjour,
Les champs qui se trouvent dans le GROUP BY doivent être dans le SELECT avant les champs de calcul. je pense au champ PLIS_INTER.PLIS_INTER qui est mal placé.

Correction:

Code : Tout sélectionner

SELECT EMETTEUR.ID_GE as IDCLIENT, EMETTEUR.LB_GE as CLIENT, PLIS_INTER.PLIS_INTER, sum(emet_fic_charge.nb_trans) as COLLECTES, SUM(emet_fic_charge.nb_cab_val) as DIFF_VAL, sum(emet_fic_charge.nb_cab_err) as DIFF_ERR, sum(emet_fic_charge.nb_doublon_strict) as DIFF_DBLON
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 571 Messages

13 nov. 2015, 13:34

tu peux virer le GROUP BY et le remplacer par la fonction de fenêtrage ( OVER ( ) ) qui est moins contraignante et a l'avantage d'être plus performante:

Code : Tout sélectionner

SELECT EMETTEUR.ID_GE as IDCLIENT, EMETTEUR.LB_GE as CLIENT, PLIS_INTER.PLIS_INTER, sum(emet_fic_charge.nb_trans) OVER (PARTITION BY EMETTEUR.ID_GE ) as COLLECTES, SUM(emet_fic_charge.nb_cab_val) OVER (PARTITION BY EMETTEUR.ID_GE ) as DIFF_VAL, sum(emet_fic_charge.nb_cab_err) OVER (PARTITION BY EMETTEUR.ID_GE ) as DIFF_ERR, sum(emet_fic_charge.nb_doublon_strict) OVER (PARTITION BY EMETTEUR.ID_GE ) as DIFF_DBLON
Ici on fait la somme pour chacun des sous-groupes ( groupement par client).


Il est tout aussi possible de faire ta requête avec le GROUP BY et dans ce cas il faut que ta sous requête et la requête principale(ton 1er select) soient hiérarchiquement au même niveau:

Code : Tout sélectionner

SELECT * FROM ( SELECT .... FROM EMETTEUR, emet_fic_charge GROUP BY EMETTEUR.ID_GE, EMETTEUR.LB_GE -- ta requête sans la sous requête SELECT SUM(nb_cab_inter_dif) as PLIS_INTER FROM -- ta sous requête )
cette dernière approche, utilisant le GROUP BY, est loin d'être optimisée contrairement à la 1ère qui utilise le fenêtrage.