sous - requête SQL - Zend framework

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : sous - requête SQL - Zend framework

Re: sous - requête SQL - Zend framework

par yann18 » 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.

Re: sous - requête SQL - Zend framework

par sadeq » 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

sous - requête SQL - Zend framework

par fr2i » 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 !!