Paumé dans une requete sql

ttk -  
Mopra-L Messages postés 150 Statut Membre -
Bonjour,
Alors voila je suis aumé dans une requete sql trop compliqué pour mes ptites méninges:
j'ai 2 tables
une table 'comptes' avec des champs : 'cle', 'article', 'date' et 'total'
une autre table 'dossiers' avec des champs 'cle' et 'nom'

le champs cle fait la relation entre les 2 tables.
et la ca se complique, je souhaiterais selon une 'date' precise WHERE date='01-01-2011'
ressortir pour chaque 'nom' le total des article correspondants en fait ressortir des lignes de ce type:

date // nom // cds // dvds // bluray
01-01-2011 // dupont // 14 // 04 // 16

je sais que je n arrive pas trés bien a expliquer ce que je veux mais n'hésitez pas à me poser des questions.
merci à vous par avance parce que je cherche depuis des heures et je m embrouille

7 réponses

dna.factory Messages postés 19682 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
peux tu nous donner quelques lignes de chacune de tables pour qu'on comprennent bien ce que tu as.

mais en gros, je pense qu'il faut jouer avec du count et du group
--
Stop failing the turing test !
0
ttk
 
salut
alors dans la table dossiers pour les champs cle,nom j ai des lignes de type :
8,dupont
7,martin

dans la table 'comptes' pour les champs cle,article,date,total j ai des lignes de type

8, dvds, 01-01-2011,3
7, cds ,01-01-2011, 5
8, dvds, 01-02-2011,0
8, cds, 01-01-2011,4

et en fait je voudrais en mettant un where de date ressortir apres requete des lignes de ce type
cle // nom // cds // dvds
8 dupont 4 3
7 martin 5 0

je vais regarder la doc sur group et count.
0
dna.factory Messages postés 19682 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
en fait, ça va au dela, il faut faire des innner join

et des requettes associés...

par contre, y'a pas de clés primaire dans ta table ?
(et si je peux me permettre, le fait d'utiliser 'clé' pour à la place de 'ident_user' peut porter à confusion.)

voila un exemple :

select
C.valeur as EAN, C2.valeur as PRIX, C3.valeur as CD_CMD
from
etiquette as E inner join
champ as C on E.article_ref=C.article_ref inner join
champ as C2 on C2.article_ref=E.article_ref inner join
champ as C3 on C3.article_ref=E.article_ref
where
C.id_template_champ=1 and C2.id_template_champ=4 and C3.id_template_champ=17;

(me demande pas (encore) de te l'expliquer, je te la retranscrit telle qu'on me l'a donnée)
Stop failing the turing test !
0
ttk
 
ouch ah ouais bon j vais essayer de bosser ça ... merci
0

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

Posez votre question
ttk
 
alors voila j ai avancé un peu mais je bloque maintenant ...

avec cette requete

select comptes.date as activite, dossiers.nom as nom, comptes.article as article, comptes.total as total from comptes,dossiers where comptes.Cle=dossiers.cle and comptes.Date=date'2011-09-01' ORDER BY comptes.Cle

j obtiens des lignes de ce type la

date // nom // article // total
2011-09-01 dupont cds 3
2011-09-01 dupont dvds 4
2011-09-01 dupont bluray 7
2011-09-01 martin cds 0
2011-09-01 martin dvds 4
2011-09-01 martin bluray 4.

mais là n'est pas ma quête je voudrais obtenir ceci :

date // nom // cds // dvds // bluray
2011-09-01 dupont 3 4 7
2011-09-01 martin 0 4 4

bref je bloque complètement...
0
dna.factory Messages postés 19682 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
maintenant il faut utiliser les inner join (j'ai l'air de connaitre, mais en fait, je galererais autant que toi, le seul avantage que j'ai sur toi, c'est que j'ai vu le résultat qui correspondait à ce que tu veux, donc je sais que c'est possible.

je regarderais ça quand j'ai 5 minutes pour vraiment réfléchir, mais je pense que tu pourras y arriver toi même.

pour info, dans la requete que je t'ai donné, considere les EAN, prix et cd_cmd en tant que tes cd, dvd, et blue ray
0
Mopra-L Messages postés 150 Statut Membre 6
 
Je pense que le problème viens principalement du fait que tu essaye de transcrire des données (cds, dvd, bluray), en colonne.

Il existe une méthode, pas forcément très propre, un peu lourde et assez rebarbative si tu as beaucoup d'articles, il s'agit de faire plusieurs jointure, une par article.

Concretement, ça donne ça :

SELECT c1.date as activite, d.nom as nom, c1.total as 'cds', c2.total as 'dvd', c3.total as 'bluray' 
FROM dossiers d
JOIN comptes c1 ON c1.cle = d.cle AND c1.article like 'cds' AND  c1.Date=date'2011-09-01' 
JOIN comptes c2 ON c2.cle = d.cle AND c2.article like 'dvds' AND c2.Date=date'2011-09-01'
JOIN comptes c3 ON c3.cle = d.cle AND c3.article like 'bluray' AND c3.Date=date'2011-09-01'
ORDER BY d.cle 


On fait donc 3 jointures avec la table comptes, une jointure par article.

Je n'ai pas pu tester cette requête, à toi de me dire si elle fonctionne et si elle convient avec ce que tu cherche à obtenir.

Sinon, il existe une méthode "propre", mais plus compliqué (je te laisse donc chercher par toi même pour ça, car je serais malheureusement incapable de t'aider à ce niveau), il s'agit des PIVOT

Voila, j'espère avoir pu t'aider !
0
vordano
 
bonjour

j'ai un commentaire a faire a propos de l'aide de mopra-L:
sa requete a le défaut de ne pas être dynamique, donc si tu décide d'ajouter un produit, tu devra refaire la requete pour la mettre a jour.
pour compenser cale pivot est (d'après moi) obligatoire,
mais a mon avis tu devra faire quelques traitement de concaténation sur la chaine de ta requète afin d'y ajouter les champs. (enfin je te dis ca mais morpra-L ou un autre auras ptete une idée)

++
0
dna.factory Messages postés 19682 Date d'inscription   Statut Modérateur Dernière intervention   1 619
 
bon argument, qui aurait tout son importance dans un milieu professionel...
mais bon, moi je m'arrete au inner join pour le moment...
(jamais entendu parler du pivot)

edit :
quoi que, à premiere vue, ça a pas l'air si compliqué :
http://blogs.developpeur.org/bfedotoff/archive/2006/12/09/comment-utiliser-PIVOTavec-une-liste-d_2700E900_l_E900_ments-variables.aspx
la requette a l'air moins 'complexe' que l'inner join
0
vordano
 
justement, tout apprentissage a pour but d'être utile en milieu professionnel :)
ca ne sert a rien d'apprendre à afficher 3 produits en forme de tableau si c'est pour le jeter 5 minutes plus tard.
voilà voilà ^^
0
Mopra-L Messages postés 150 Statut Membre 6
 
Il est évident que la requête que je proposais n'était absolument pas optimisé, mais je ne savais pas vraiment pour quel usage elle était destiné, à vrai dire !

Personnellement, j'ai eu beaucoup de mal à comprendre la notion de Pivot, mais c'est peut-être trivial pour d'autre, en effet !
0