Requete SQL

Fermé
pulls Messages postés 136 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 13 septembre 2023 - Modifié par pulls le 8/02/2014 à 18:21
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 14 févr. 2014 à 11:15
Bonjour,

j'ai une table qui se présente comme suit:

Date N° vente Vendeur produit1 produit2 produit3 total
01/01/2014 1 M10100 5 000 3 000 2 000 10 000
01/01/2014 1000 M10100 1500 2500 0 4 000
01/01/2014 500 M10100 700 200 0 900
01/01/2014 1 M10200 4 000 2 000 1 000 7 000
01/01/2014 1000 M10200 2500 3500 0 6 000
01/01/2014 500 M10200 1700 1200 0 2 900

02/01/2014 2 M10100 6 000 4 000 3 000 13 000
02/01/2014 1001 M10100 2500 3500 0 6 000
02/01/2014 501 M10100 1700 1200 0 2 900
02/01/2014 2 M10200 5 000 3 000 2 000 10 000
02/01/2014 1001 M10200 3500 4500 0 8 000
02/01/2014 501 M10200 2700 2200 0 4 900



Je dois regrouper les ventes de produit1 et produit2 en V1 ( vente du jour) et V2 ( vente de la nuit) suivant les critères suivants:

- les n° de vente de 1 à 499 represente les ventes de produit1, produit2 de couleur rouge en V1

- les n° de vente supérieur à 1000 représentent les ventes de produit1 et produit2 de couleur verte toujours en V1

- Enfin les n° de vente de 500 à 999 représente les ventes de produit1 et produits2 en nocturne toute couleur confondue comme V2


Nous remarquons que le produit3 n'est pas concerné par le regroupement en V1 et V2 et se trouve dans la plage de n° de vente de 1 à 499.

Je voudrais construire requête SQL avec php pour avoir le résultat suivant:



Date Vendeur V1 V2 produit3 Total

01/01/2014 M10100 12 000 900 2 000 14 900
01/01/2014 M10200 12 000 2900 1 000 15 900

02/01/2014 M10100 16 000 2900 3 000 21 900
02/01/2014 M10200 16 000 4900 2 000 22 900


Je ne sais pas si je me suis fait comprendre, je n'ai pas pu trouver une solution de requête, aidez moi.
Excusez moi de la mise en page du tableau, j'espère que le gras vous permettra de distinguer les colonnes

Cordialement

6 réponses

Célien Messages postés 5729 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 9 septembre 2021 1 993
9 févr. 2014 à 18:55
Salut,

On ne va pas faire l'exercice à ta place, à lire : Demander de l'aide pour vos exercices sur CCM. Tu peu apprendre SQL dans un livre ou ici par exemple : Cours SQL.
0
pulls Messages postés 136 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 13 septembre 2023 3
Modifié par pulls le 10/02/2014 à 15:31
Merci Célien de vouloir m'aider.

J'ai bien lu mon cours SQL et j'ai déjà developpé des applications avec des requetes SQL, mais je n'ai pas encore rencontré ce cas de figure .

Voici ce que j'ai essayé de faire :


SELECT date, vendeur, (SUM(produit1)+SUM(produit2)) as V1, produit3 FROM tab1 where n°_vente between 1 and 499 and N°_vente>1000 group by date,vendeur



SELECT date, vendeur , (SUM(produit1)+SUM(produit2)) as V2, produit3 FROM tab1 where n°_vente between 500 and 999 group by date,vendeur

Comment fusionner ces 2 requetes pour avoir un seul résultat, avec les champs date, vendeur, V1,V2,produit3, Total(V1+V2+produit3) ?

S'il vous plait aidez moi, depuis plusieurs jours , je réfléchis sans suite.

merci
0
Célien Messages postés 5729 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 9 septembre 2021 1 993
10 févr. 2014 à 15:43
Peut être ça ?
"La commande UNION de SQL permet de mettre bout-à-bout les résultats de plusieurs requêtes utilisant elles-même la commande SELECT"
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
10 févr. 2014 à 16:34
Bonjour,

UNION n'est pas la solution, car elle renvoie des lignes différentes.
Non, là il faut simplement jouer avec les SUM et des case...when.
Cela n'a rien de très compliqué, mais comme déjà dit, on n'est pas là pour faire vos devoirs à votre place :)

Xavier
0
pulls Messages postés 136 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 13 septembre 2023 3
10 févr. 2014 à 16:26
S'il vous plait , est ce qu'on peut faire un UNION sur la même table, est ce que un vendeur ne doit pas apparaitre 2 fois à la même date alors que je veux les grouper.

cordialement
0
pulls Messages postés 136 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 13 septembre 2023 3
10 févr. 2014 à 18:24
J'ai essayé ceci:

select date,vendeur,prod3,
case
when (course between 1 and 499 ) or (course >1000)
then SUM(prod1)+SUM(prod2) as V1
when course between 500 and 999
then SUM(prod1)+SUM(prod2) as V2
FROM tab1 group by date,vendeur


Mais ça me renvoit une erreur de syntaxe: #1064 - 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 'as V1 when course between 500 and 999 then SUM(prod1)+SUM(prod2) a' at line 4

cordialement
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 11/02/2014 à 08:59
Bonjour,

Tu n'es pas loin.
Essaie ça :
select date, vendeur, SUM(produit3) as produit3,
      SUM( case
            when (course between 1 and 499 ) or (course >1000)
            then produit1 + produit2
            else 0 end) as V1,
      SUM( case
            when course between 500 and 999 
            then produit1 + produit2
            else 0 end) as V2,
      SUM(produit1 + produit2 + produit3) as total
FROM tab1 group by date,vendeur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pulls Messages postés 136 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 13 septembre 2023 3
10 févr. 2014 à 19:42
S'il vous plait, je crois que je suis à un pas d'avoir le bon résultat en procédant ainsi car je suis sur MYSQL:


select date,vendeur,prod3,

IF ((course < 499 ) or (course >1000),SUM(prod1)+SUM(prod2),0) as V1,

IF((course between 500 and 999),SUM(prod1)+SUM(prod2),0) as V2

from tab1 group by date,vendeur



Le champ V1 se calcule bien, mais le champ V2 affiche plutot 0, je ne comprends pas pourquoi.

Si vous avez une expérience dessus, aidez moi pour que je puisse avancer

Merci
0
pulls Messages postés 136 Date d'inscription mercredi 30 décembre 2009 Statut Membre Dernière intervention 13 septembre 2023 3
14 févr. 2014 à 10:37
Merci Reivax962,

ça marche, je te remercie infiniment. S'il te plait, je ne comprends pas bien la position de SUM devant CASE, alors qu'après THEN , on doit faire une addition.

Cordialement
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
14 févr. 2014 à 11:15
Pour bien comprendre, exécute cette requête sans les SUM ni le group by, et compare le résultat :
select date, vendeur, produit3,
      case
            when (course between 1 and 499 ) or (course >1000)
            then produit1 + produit2
            else 0 end as V1,
      case
            when course between 500 and 999 
            then produit1 + produit2
            else 0 end as V2,
      produit1 + produit2 + produit3 as total
FROM tab1
0