besoin d'aide pour requête SQL

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 : besoin d'aide pour requête SQL

par Invité » 27 févr. 2008, 11:14

C'est bon, j'ai trouvé pourquoi. En fait, il fallait que je précise le code du produit dans la clause WHERE pour pouvoir effectuer cette opération sur un seul produit.

Je vous remercie encore de m'avoir consacré du temps et m'avoir permis d'avancer dans mon projet de stage. ! 1000 mercis !

par Invité » 27 févr. 2008, 11:12

Merci à vous 2.

Cyrano, j'ai un soucis quand je réalise cette requête... Le résultat retourné affiche tous les produits avec le même nombre qui s'ajoute à chaque fois... Normal ?

par Patriboom » 26 févr. 2008, 21:49

Tu vois ... je n'aurais jamais pensé à IS NOT NULL, car je n'ai jamais eu à l'utiliser. J'en connaissais l'existence sans plus. Merci Cyrano

par Cyrano » 26 févr. 2008, 20:28

C'est le GROUP BY dans ta sous-requête qui ruine tout. D'autre part, tu compares en faisant ".. != '' .. ce qui au passage devrait en SQL standard s'écrire ".. <> '' .." , mais NULL est différent de "chaine vide. Donc on utilisera "IS NOT NULL".

J'ai procédé à un test avec un jeu d'essai comprenant plus de données dans la table "reservation" :

Code : Tout sélectionner

mysql> SELECT * FROM reservation; +--------+------------+------------+-------------+---------+----------+----------+ | numero | datedepart | dateretour | quantiteres | codesal | codetype | codeprod | +--------+------------+------------+-------------+---------+----------+----------+ | 1 | 2008-02-14 | NULL | 2 | s001 | pcp | pcp1 | | 2 | 2008-02-15 | NULL | 2 | s001 | pcp | pcp1 | | 3 | 2008-02-15 | 2008-02-28 | 5 | s001 | pcp | pcp1 | | 4 | 2008-02-16 | 2008-02-29 | 3 | s001 | pcp | pcp1 | +--------+------------+------------+-------------+---------+----------+----------+ 4 rows in set (0.00 sec)
Là où la date retour n'est pas nulle, j'ai un total de huit articles, je devrais donc obtenir 12 + 8 = 20 articles :

Code : Tout sélectionner

mysql> SELECT -> PRODUIT.quantite AS qteProd, -> SUM(PRODUIT.quantite + ( -> SELECT SUM(quantiteres) -> FROM reservation -> WHERE dateretour IS NOT NULL -> ) -> ) as total -> FROM produit as PRODUIT -> GROUP BY PRODUIT.codeprod; +---------+-------+ | qteProd | total | +---------+-------+ | 12 | 20 | +---------+-------+ 1 row in set (0.00 sec)

par Patriboom » 26 févr. 2008, 20:03

Dans un tel cas, ça dépasse mes compétences.

Pour contourner le problème, je passerais donc par une série de requêtes encadrées par un WHILE ... fetch de la sous-requête transformée en requête principale. En cas, ça voudrait dire quelque chose comme:
$requete_RESERV = "SELECT SUM(quantitereserve) FROM reservation WHERE dateretour != '' GROUP BY dateretour";
$resultats_RESERV = mysql_query($requete1, $db);

WHILE ($Quel_RESERV =  mysql_fetch_object($resultats_RESERV) {
     $requete_PROD  = "SELECT PRODUIT.quantite AS qteProd,   ";
     $requete_PROD .= "SUM(PRODUIT.quantite + ".$Quel_RESERV." ) as somme   ";
     $requete_PROD .= "FROM produit as PRODUIT  ";
     $requete_PROD .= "GROUP BY PRODUIT.codeprod ";
     $resultats_RESERV = mysql_query($requete_PROD, $db);
     $Valeur_utilisable[] = mysql_fetch_object($resultats_RESERV);
}

Tu peux alors travailler avec le tableau de données $Valeur_utilisable qui aura les valeurs suivantes:

$Valeur_utilisable[0]->qteProd = (valeur)
$Valeur_utilisable[0]->somme = (valeur)
$Valeur_utilisable[1]->qteProd = (valeur)
$Valeur_utilisable[1]->somme = (valeur)
...


J'espère la réponse d'autres plus compétents pour en apprendre moi aussi.

par Invité » 26 févr. 2008, 11:10

Je viens de rajouter une ligne de données dans ma table réservation. J'ai désormais 2 réservations qui ont une dateretour différente de null. La requête ne fonctionne plus car la sous requête retourne plusieurs résultats et ça ne plaît pas à MySql...

par Invité » 26 févr. 2008, 11:04

Je viens de tester ta requête Patriboom. Elle fonctionne, mais je pense qu'il faut que je rajoute un critère dans la clause WHERE car quand j'exécute la requête, il m'ajoute à toutes les quantité de la table produit la quantité du produit retourné. Je pense donc qu'il faut que je précise le code du produit retourné.

par Invité » 26 févr. 2008, 10:46

Voici ma base de données :
TABLE RESERVATION :

create table reservation(numero int auto_increment, datedepart date, dateretour date, quantiteres int, codesal varchar(10),
 codetype varchar(10), codeprod varchar(10), primary key(numero), foreign key(codesal) references salarie(codesal), foreign key(codetype)
 references type(codetype), foreign key(codeprod) references produit(codeprod));


insert into reservation(datedepart, dateretour, quantiteres, codesal, codetype, codeprod) values ('2008/02/14', null, 2, 's001', 'pcp', 'pcp1');



TABLE PRODUIT :

create table produit(codeprod varchar(10), modele varchar(10), marque varchar(30), quantite int, codetype varchar(10), primary key(codeprod), foreign key(codetype) references type(codetype));

insert into produit(codeprod, modele, marque, quantite, codetype) values ('pcp1', 'Inspiron 9400', 'Dell', 12, 'pcp');





TABLE SALARIE :

create table salarie(codesal varchar(10), nom varchar(50), prenom varchar(50), primary key(codesal));

insert into salarie(codesal, nom, prenom) values('s001', 'Dupont', 'Claude');


TABLE TYPE :

create table type(codetype varchar(10), libelle varchar(50), primary key(codetype));

insert into type(codetype, libelle) values('pcp', 'Ordinateur portable');
Je vous remercie encore du temps que vous m'accordez.

par Patriboom » 26 févr. 2008, 07:29

Ceci ne me donne pas d'erreur, c'est donc un indice de faisabilité:

Code : Tout sélectionner

SELECT PRODUIT.quantite AS qteProd, SUM(PRODUIT.quantite + (SELECT SUM(quantitereserve) FROM reservation WHERE dateretour != '' GROUP BY dateretour) ) FROM produit as PRODUIT GROUP BY PRODUIT.codeprod
Je n'ai pas de données dans mes tables, je n'obtiens donc pas de résultats.
Présente-nous tes bases en code MySQL (CREATE TABLE) et donne-nous quelques données (INSERT ) pour que nous puissions t'aider.

par Patriboom » 26 févr. 2008, 07:28

Ceci ne me donne pas d'erreur, c'est donc une piste de faisabilité:

Code : Tout sélectionner

SELECT PRODUIT.quantite AS qteProd, SUM(PRODUIT.quantite + (SELECT SUM(quantitereserve) FROM nikko_reservation WHERE dateretour != '' GROUP BY dateretour) ) FROM nikko_produit as PRODUIT GROUP BY PRODUIT.codeprod
Je n'ai pas de données dans mes tables, je n'obtiens donc pas de résultats.
Présente-nous tes bases en code MySQL (CREATE TABLE) et donne-nous quelques données (INSERT ) pour que nous puissions t'aider.

par Invité » 25 févr. 2008, 10:42

quand je change la virgule en '+', il me met une erreur comme quoi 'qteprod' n'existe pas... voici ma requête caractère pour caractère :

select produit.quantite as qteprod, (select sum(quantiteres) from reservation where dateretour is not null group by dateretour) as qteres, sum(qteprod + qteres) from produit as produit;

Ce que je ne comprends pas dans cette requête c'est que l'allias "qteres" ne fait pas parti de la table produit, or, dans la "requête globale", on ne sélectionne que la table produit. Et je ne comprends pas pourquoi on lui accorde un allias (... from produit as produit).

par Invité » 25 févr. 2008, 10:36

Merci, je rééssaie ca de suite !

par Cyrano » 25 févr. 2008, 10:31

La fonction SQL SUM() attend un seul paramètre qui peut être sous la forme d'une expression genre SUM(col1 + col2) par exemple, mais certainement pas SUM(col1, col2) où on voit deux paramètres. :-k

par Invité » 25 févr. 2008, 10:06

A priori, il y aurai une erreur de syntaxe dans la requête.

==> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' qtereserv) from produit as produit' at line 1

par Invité » 25 févr. 2008, 09:56

Je te remercie de ta réponse et du temps que tu m'as consacré. Je vais essayer cette requête et te dire si elle fonctionne ou pas :wink:

Nikko