Plusieurs requetes SQL en une seul sous forme de tableau [RESOLU] - SQL/NoSQL - Programmation
Marsh Posté le 26-10-2009 à 14:07:06
si deux solutions, soit tu joues avec des union/union all, soit tu gères ca avec le langage qui te sert a présenter les données.
Marsh Posté le 26-10-2009 à 14:30:01
union ou union all marchera pas, ptet faire des alias de ma table dbo_r_wrkgrp car j'applique mes conditions sur cette table la a chaque fois.
Sauf que la syntaxe pour faire des alias de table ben je sais pas faire :s
Marsh Posté le 26-10-2009 à 14:39:50
Tu pourrais donner le schéma de ta base et expliquer ce que tu veux obtenir en français ? Parce que là pour être honnête je trouve tes requêtes SQL difficilement lisible, et je ne comprend pas ce que tu essayes de faire.
Marsh Posté le 26-10-2009 à 14:50:49
tu seras gentil de me dire pourquoi un union all ne marcherait pas, parce que pour moi il n'y a qu'a unioner tes 4 requêtes, sur-selecter pour ré-appliquer un group by, et passer au taf suivant
Marsh Posté le 26-10-2009 à 15:02:48
de toute façon, le SQL ne sert qu'à extraire les données, et pas à les présenter. ça c'est le boulot du langage client. va bien falloir finir par comprendre (et tu n'es pas le seul, rassure toi) qu'un SGBD c'est pas Excel.
Marsh Posté le 26-10-2009 à 15:07:10
casimimir a écrit : tu seras gentil de me dire pourquoi un union all ne marcherait pas, parce que pour moi il n'y a qu'a unioner tes 4 requêtes, sur-selecter pour ré-appliquer un group by, et passer au taf suivant |
Un UNION va te mettre les 4 tableaux bout à bout en ligne, là il les veux en colonnes. Comment tu ferais ?
Marsh Posté le 26-10-2009 à 15:17:42
cgo2 a écrit : |
une requête imbuvable avec des jointures dans tous les sens.
Marsh Posté le 26-10-2009 à 15:18:13
Citation : |
voilà mon pb ><, la j'essaye crystal report pour la mise en forme, mon maitre d'apprentissage est gentil
Marsh Posté le 26-10-2009 à 15:21:47
Citation : |
du genre ?
Marsh Posté le 26-10-2009 à 15:23:36
hazzelthorn a écrit :
|
non mais sinon, ton problème est très simple à résoudre hein !
tu fais un gros SELECT de l'ensemble des champs présents dans tes requêtes FROM (tables de la clause FROM de la req 1) INNER JOIN (tables de la clause FROM de la req 2) ON (champs communs) INNER JOIN (tables de la clause FROM de la req 3)....
ça va donner un truc parfaitement lent et illisible, mais ça marchera.
Marsh Posté le 26-10-2009 à 15:26:43
hazzelthorn a écrit :
|
du genre que UNION permet de fusionner 2 recordsets dans le sens vertical. or toi, tu veux une fusion dans le sens horizontal. donc ça passe par des jointures entres tes différentes requêtes. lesquelles requêtes comportent déjà des jointures. donc tu vas être obligé de faire des jointures de recordsets déjà constitués de jointures, je te laisse imaginer le souk.
le mieux est donc de laisser tes requêtes telles quelles, et de les retraiter séparément dans le langage client
Marsh Posté le 26-10-2009 à 15:28:15
et créer des alias de ma table ou j'éxécute mes conditions ca peut pas marcher ? car mon problème se situe à ce niveau la, j'ai une seule table où mes conditions changent...
Marsh Posté le 26-10-2009 à 15:33:33
Harkonnen a écrit : du genre que UNION permet de fusionner 2 recordsets dans le sens vertical. or toi, tu veux une fusion dans le sens horizontal. donc ça passe par des jointures entres tes différentes requêtes. lesquelles requêtes comportent déjà des jointures. donc tu vas être obligé de faire des jointures de recordsets déjà constitués de jointures, je te laisse imaginer le souk. |
C'est tout à fait vrai, sauf que dans certains cas (notamment les COUNT, dont il est question ici) il est possible de réécrire *proprement* toute la requête pour obtenir ce qu'il veut sans avoir un truc complètement moisi niveau performances et lisibilité. Je sais si c'est possible là, et c'est pour ça que je demandais un schéma de la table et une explication en français, parce que j'ai pas envie de passer 2 heures à tenter de comprendre ces requêtes moches. Mais bon...
Marsh Posté le 26-10-2009 à 15:37:58
ReplyMarsh Posté le 26-10-2009 à 15:54:55
hazzelthorn a écrit : un schéma de la table ? que veux tu ? |
La structure des tables quoi... Enfin bon laisse tomber, je vais t'expliquer la méthode dont je parlais, et tu essayeras de voir si ça peut s'appliquer dans ton cas ou pas. Je pense que ça correspond à ce que tu veux faire, mais je peux me tromper.
Disons que tu as une table "table", avec les champs "id" et "priorite". Le champs priorité peut prendre 3 valeurs (bas, normal et haut), et tu veux un resultset comme ça :
id | nb_bas | nb_normal | nb_haut |
L'astuce c'est d'écrire une requête comme ça :
|
ou comme ça (c'est equivalent) :
|
Vu que tu fais toutes tes requêtes sur les même tables, avec seulement les conditions qui changent, je pense que cette technique peut fonctionner. L'idée c'est de mettre les conditions dans le SELECT et non dans le WHERE.
Marsh Posté le 26-10-2009 à 16:58:43
cgo2 a écrit : |
Harkonnen a écrit : |
je ferai comme ca, et je suis d'accord que c'est moche, mais en sql sans connaitre son modèle de donnée et sans avoir envie de s'y plonger je ne ferai pas mieux pour que son truc marche en 30 secs (le temps de copier/coller comme un porc), maintenant effectivement c'est le rôle du langage de présentation a afficher.
Après faut pas s'attendre a être engagé la après ton stage
Code :
|
Marsh Posté le 26-10-2009 à 17:01:51
c'est encore pîre que ce que je croyais
Marsh Posté le 26-10-2009 à 17:54:41
bonbonbon, en passant 5 mins a comprendre on tombe finalement la dessus, mais 5mins vs 30 secs quoi...
je sais pas si le case est syntaxiquement correct en mssql
Code :
|
Marsh Posté le 26-10-2009 à 19:25:25
et bien vous savez quoi, je vous remercie, étant étudiant en BTS IG en alternance et novice en SQL j'apprends petit a petit, le but de mon maitre d'apprentissage étant de me faire comprendre la logique du langage SQL
merci casimimir, cgo2 et harkonnen mon maitre d'apprentissage ayant lu vos commentaires m'a bien fait comprendre qu'il y avait plusieurs façons d'arriver au résultat qu'il me demandait.
Vos réponses sont très instructives !!
Merci,
(je n'ai pas encore pu tester vos solutions, je vous tiens au courant demain)
Marsh Posté le 27-10-2009 à 10:41:53
casimimir a écrit : bonbonbon, en passant 5 mins a comprendre on tombe finalement la dessus, mais 5mins vs 30 secs quoi... |
Ah ben voila c'est la méthode à laquelle je pensais, et là la requête est quand même plus jolie.
Marsh Posté le 27-10-2009 à 13:58:58
voila la requete sous crystal report (qui soit dit en passant est bien plus intuitif que Acess )
SELECT "p_rqt"."RqtStsInCde", "r_pri"."PriExCde", "r_pri"."PriDsc", "r_wrkgrp"."WrkGrpInCde"
FROM "absyss_test"."dbo"."r_wrkgrp" "r_wrkgrp"
INNER JOIN ("absyss_test"."dbo"."r_pri" "r_pri"
INNER JOIN "absyss_test"."dbo"."p_rqt" "p_rqt" ON "r_pri"."PriInCde"="p_rqt"."PriInCde" )
ON "r_wrkgrp"."WrkGrpInCde"="p_rqt"."DstWrkGrpInCde"
WHERE "p_rqt"."RqtStsInCde"<>5
AND ("r_pri"."PriDsc"='A - Perturbant la production'
OR "r_pri"."PriDsc"='B - Gênant mais contournable'
OR "r_pri"."PriDsc"='C - Evolution à prendre en compte')
AND NOT ("r_wrkgrp"."WrkGrpInCde"=1
OR "r_wrkgrp"."WrkGrpInCde"=2
OR "r_wrkgrp"."WrkGrpInCde"=5
OR "r_wrkgrp"."WrkGrpInCde"=10
OR "r_wrkgrp"."WrkGrpInCde"=11
OR "r_wrkgrp"."WrkGrpInCde"=13
OR "r_wrkgrp"."WrkGrpInCde"=14
OR "r_wrkgrp"."WrkGrpInCde"=15
OR "r_wrkgrp"."WrkGrpInCde"=17
OR "r_wrkgrp"."WrkGrpInCde"=18
OR "r_wrkgrp"."WrkGrpInCde"=20
OR "r_wrkgrp"."WrkGrpInCde"=22
OR "r_wrkgrp"."WrkGrpInCde"=23
OR "r_wrkgrp"."WrkGrpInCde"=24
OR "r_wrkgrp"."WrkGrpInCde"=26
OR "r_wrkgrp"."WrkGrpInCde"=30)
avec le champ de formule suivant sous crystal report pour faire la somme de groupe en travail
if {r_wrkgrp.WrkGrpInCde} in [3,4] then 'Support'
else if {r_wrkgrp.WrkGrpInCde} in [8,28,29] then 'Intégration'
else if {r_wrkgrp.WrkGrpInCde} in [9,19,27] then 'Dev'
else if {r_wrkgrp.WrkGrpInCde} in [16,21,6,12,7,25] then 'Fin de Dossier'
merci a vous tous de votre aide j'ai appris beaucoup de choses
Marsh Posté le 30-10-2009 à 21:52:34
Non,
il faut faire un case. Voilà un exemple :
http://www.adp-gmbh.ch/ora/sql/examples/pivot.html
Il fonctionne parfaitement, je m'en sers au boulot pour par exemple afficher des rubriques dans la colonne de gauche en lieu et place de tes PRIORITE, et des soldes sur différentes périodes comptables en haut.
Marsh Posté le 26-10-2009 à 10:03:50
Bonjour,
Voilà mon pb j'ai 4 requêtes SQL qui séparément m'affichent un tableau comme ceci
PRIORITE / Support
A XX
B YY
C ZZ
PRIORITE / Intégration
A XX
B YY
C ZZ
PRIORITE / Dev
A XX
B YY
C ZZ
PRIORITE / Fin de dossier
A XX
B YY
C ZZ
Mon but est d'arriver a ceci
PRIORITE / Support / Integration / Dev / Fin de Dossier
A XX XX XX XX
B YY YY YY YY
C ZZ ZZ ZZ ZZ
voila les requêtes pour chacune des colonnes
Support :
SELECT dbo_r_pri.PriDsc AS Priorité, Count(*) AS Support
FROM (dbo_p_rqt INNER JOIN dbo_r_pri ON dbo_p_rqt.PriInCde=dbo_r_pri.PriInCde) INNER JOIN dbo_r_wrkgrp ON dbo_p_rqt.DstWrkGrpInCde=dbo_r_wrkgrp.WrkGrpInCde
WHERE (((dbo_p_rqt.RqtStsInCde)<>5) AND ((dbo_r_wrkgrp.WrkGrpDsc)="Front Office" Or (dbo_r_wrkgrp.WrkGrpDsc)="Back Office" ) AND ((dbo_r_pri.PriDsc)="B - Gênant mais contournable" Or (dbo_r_pri.PriDsc)="A - Perturbant la production" Or (dbo_r_pri.PriDsc)="C - Evolution à prendre en compte" ))
GROUP BY dbo_r_pri.PriDsc;
Integration :
SELECT dbo_r_pri.PriDsc AS Priorité, Count(*) AS Integration
FROM (dbo_p_rqt INNER JOIN dbo_r_pri ON dbo_p_rqt.PriInCde=dbo_r_pri.PriInCde) INNER JOIN dbo_r_wrkgrp ON dbo_p_rqt.DstWrkGrpInCde=dbo_r_wrkgrp.WrkGrpInCde
WHERE (((dbo_p_rqt.RqtStsInCde)<>5) AND ((dbo_r_wrkgrp.WrkGrpDsc)="Documentation" Or (dbo_r_wrkgrp.WrkGrpDsc)="Intégration Road Map" Or (dbo_r_wrkgrp.WrkGrpDsc)="V5 - Intégration Road Map" ) AND ((dbo_r_pri.PriDsc)="B - Gênant mais contournable" Or (dbo_r_pri.PriDsc)="A - Perturbant la production" Or (dbo_r_pri.PriDsc)="C - Evolution à prendre en compte" ))
GROUP BY dbo_r_pri.PriDsc;
Dev :
SELECT dbo_r_pri.PriDsc AS Priorité, Count(*) AS Dev
FROM (dbo_p_rqt INNER JOIN dbo_r_pri ON dbo_p_rqt.PriInCde=dbo_r_pri.PriInCde) INNER JOIN dbo_r_wrkgrp ON dbo_p_rqt.DstWrkGrpInCde=dbo_r_wrkgrp.WrkGrpInCde
WHERE (((dbo_p_rqt.RqtStsInCde)<>5) AND ((dbo_r_wrkgrp.WrkGrpDsc)="Intégration" Or (dbo_r_wrkgrp.WrkGrpDsc)="Develo_planifiées" Or (dbo_r_wrkgrp.WrkGrpDsc)="BPM - Intégration" ) AND ((dbo_r_pri.PriDsc)="B - Gênant mais contournable" Or (dbo_r_pri.PriDsc)="A - Perturbant la production" Or (dbo_r_pri.PriDsc)="C - Evolution à prendre en compte" ))
GROUP BY dbo_r_pri.PriDsc;
Fin de dossier :
SELECT dbo_r_pri.PriDsc AS Priorité, Count(*) AS [Fin de Dossier]
FROM (dbo_p_rqt INNER JOIN dbo_r_pri ON dbo_p_rqt.PriInCde = dbo_r_pri.PriInCde) INNER JOIN dbo_r_wrkgrp ON dbo_p_rqt.DstWrkGrpInCde = dbo_r_wrkgrp.WrkGrpInCde
WHERE (((dbo_p_rqt.RqtStsInCde)<>5) AND ((dbo_r_wrkgrp.WrkGrpDsc)="V5 - Livraison" Or (dbo_r_wrkgrp.WrkGrpDsc)="V5 - Qualification" Or (dbo_r_wrkgrp.WrkGrpDsc)="Qualification"
or (dbo_r_wrkgrp.WrkGrpDsc)="Mise en production" or (dbo_r_wrkgrp.WrkGrpDsc)="Livraison" or (dbo_r_wrkgrp.WrkGrpDsc)="BPM - Qualification" )
AND ((dbo_r_pri.PriDsc)="B - Gênant mais contournable" Or (dbo_r_pri.PriDsc)="A - Perturbant la production" Or (dbo_r_pri.PriDsc)="C - Evolution à prendre en compte" ))
GROUP BY dbo_r_pri.PriDsc;
Voilà, j'suis un novice en SQL j'considère un miracle d'être arrivé jusque là, si vos lumières pouvaient m'éclairer
Message édité par hazzelthorn le 28-10-2009 à 10:36:47