Paumé dans une requete sql
ttk
-
Mopra-L Messages postés 150 Statut Membre -
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
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
A voir également:
- Paumé dans une requete sql
- Logiciel sql - Télécharger - Bases de données
- Capture d'écran par glissement de paume - Guide
- Jointure sql ✓ - Forum MySQL
- Requête sql pour afficher uniquement les fleurs dont le prix est strictement inférieur à 10 euros ✓ - Forum DS
- Sql (+) - Forum Programmation
7 réponses
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 !
mais en gros, je pense qu'il faut jouer avec du count et du group
--
Stop failing the turing test !
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.
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.
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 !
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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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...
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...
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
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
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 :
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 !
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 !
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)
++
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)
++
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
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