IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

sql mixe de deux requetes complexes


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 745
    Points : 166
    Points
    166
    Par défaut sql mixe de deux requetes complexes
    Bonjour,

    Voila je m'explique, c'est assez compliqué....

    j'ai une premiere requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT     Ref, NbRef, STR(CAST(NbRef / 4640 * 100 AS decimal(10, 4)), 10, 4) + ' %' AS Poids
    FROM         (SELECT DISTINCT SUBSTRING(ReferentCommande.Referent, 1, 3) AS Ref, CAST(COUNT(*) AS decimal) AS NbRef
                           FROM          ReferentCommande INNER JOIN
                                                      (SELECT     Id
                                                        FROM          Dossier
                                                        WHERE      (EtatDossier = 16 OR
                                                                               EtatDossier = 0) AND (CONVERT(datetime, Saisie, 103) BETWEEN '28/08/2006' AND '30/09/2006') AND (TDossier = 0)) 
                                                  AS IdDossier ON ReferentCommande.Dossier = IdDossier.Id
                           GROUP BY SUBSTRING(ReferentCommande.Referent, 1, 3)) AS derivedtbl_1
    ORDER BY NbRef DESC
    qui me renvoie :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Pa	97	    2.0905 %
    LVE	24	    0.5172 %
    NEW	22	    0.4741 %
    GOO	22	    0.4741 %
    CLA	13	    0.2801 %
    KEL	12	    0.2586 %
    OVE	10	    0.2155 %
    c'est a dire pour uen periode, le nombre de commande passée, avec quelle reference (3 premieres lettres) et le poids de ces commandes sur le total.



    ensuite j'ai une autre requete :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT     ReferentA, ReferentB, Nbr
    FROM         (SELECT     SUBSTRING(A.Referent, 1, 3) AS ReferentA, SUBSTRING(B.Referent, 1, 3) AS ReferentB, COUNT(*) AS Nbr, row_number() OVER (partition BY 
                                                  substring(A.Referent, 1, 3)
                           ORDER BY COUNT(*) DESC) NbrLigne
    FROM         ReferentCommande AS A INNER JOIN
                          ReferentCommande AS B ON A.Dossier = B.Dossier AND SUBSTRING(A.Referent, 1, 3) <> SUBSTRING(B.Referent, 1, 3)
    WHERE     A.Dossier IN
                              (SELECT     Id
                                FROM          Dossier
                                WHERE      (EtatDossier = 16 OR
                                                       EtatDossier = 0) AND (CONVERT(datetime, Saisie, 103) BETWEEN '28/08/2006' AND '30/09/2006') AND (TDossier = 0))
    GROUP BY substring(A.Referent, 1, 3), substring(B.Referent, 1, 3)) C
    WHERE     NbrLigne <= 3
    qui a pour resultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     Pa	GOO	12
     Pa	LVE	9
     Pa	OVE	8
    CEL	NEW	1
    DIM	OVE	8
    DIM	KEL	4
    DIM	PRO	4
    ESV	LOC	1
    ESV	 Pa	1
    GOO	 Pa	12
    GOO	YAH	2
    KEL	OVE	8
    KEL	 Pa	7
    KEL	DIM	4
    LOC	 Pa	2
    LOC	ESV	1
    LOC	LVE	1
    LVE	 Pa	9
    LVE	KEL	4
    LVE	OVE	4
    MIV	 Pa	3
    NEW	 Pa	1
    NEW	CEL	1
    OVE	PRO	10
    OVE	 Pa	8
    OVE	DIM	8
    PRO	OVE	10
    PRO	KEL	4
    PRO	DIM	4
    YAH	GOO	2

    c'est a dire pour la meme periode de temps les origines de mes referents(...)


    et moi j'aimerais a mixer ces deux requetes pour avoir un resultat de la sorte qui me ramene les trois premieres colonnes du tableau avec 12 colonnes supplémentaires, à savoir, par exemple pour la premiere ligne de ma premiere requete (ligne pa) j'aurai ensuite goo 12 12/97(*) 12/22(**) LVE 9 9/97(*) 9/24(**) OVE 8 8/97(*) 8/10(**)

    (*) qui serait 12 divisé par 97 pour la part de goo dans la deuxieme requete correspondant a Pa dans la premiere

    et

    (**) qui serait 12 divisé par 22 pour cette fois la part de goo dans la deuxieme requete correspondant tjs a Pa dans le premiere mais cette fois ramené a goo dans la premiere.....


    Je sais c'est assez flou et en meme temps relativement complexe!


    Si un PRO du sql avait l'obligence de se pencher la dessus...

    Je lui en serais extremement reconnaissant!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 745
    Points : 166
    Points
    166
    Par défaut
    j'ai bien trouvé cela comme requete pour "mixer" les deux autres :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    SELECT     ref, nbref, poids, referentb, nbr
    FROM         (SELECT     Ref, NbRef, STR(CAST(NbRef / 4640 * 100 AS decimal(10, 4)), 10, 4) + ' %' AS Poids
                           FROM          (SELECT DISTINCT SUBSTRING(ReferentCommande.Referent, 1, 3) AS Ref, CAST(COUNT(*) AS decimal) AS NbRef
                                                   FROM          ReferentCommande INNER JOIN
                                                                              (SELECT     Id
                                                                                FROM          Dossier
                                                                                WHERE      (EtatDossier = 16 OR
                                                                                                       EtatDossier = 0) AND (CONVERT(datetime, Saisie, 103) BETWEEN '28/08/2006' AND '30/09/2006') AND 
                                                                                                       (TDossier = 0)) AS IdDossier ON ReferentCommande.Dossier = IdDossier.Id
                                                   GROUP BY SUBSTRING(ReferentCommande.Referent, 1, 3)) AS derivedtbl_1) AS ader INNER JOIN
                              (SELECT     ReferentA, ReferentB, Nbr
                                FROM          (SELECT     SUBSTRING(A.Referent, 1, 3) AS ReferentA, SUBSTRING(B.Referent, 1, 3) AS ReferentB, COUNT(*) AS Nbr, row_number() 
                                                                               OVER (partition BY substring(A.Referent, 1, 3)
                                                        ORDER BY COUNT(*) DESC) NbrLigne
                                FROM          ReferentCommande AS A INNER JOIN
                                                       ReferentCommande AS B ON A.Dossier = B.Dossier AND SUBSTRING(A.Referent, 1, 3) <> SUBSTRING(B.Referent, 1, 3)
                                WHERE      A.Dossier IN
                                                           (SELECT     Id
                                                             FROM          Dossier
                                                             WHERE      (EtatDossier = 16 OR
                                                                                    EtatDossier = 0) AND (CONVERT(datetime, Saisie, 103) BETWEEN '28/08/2006' AND '30/09/2006') AND (TDossier = 0))
                                GROUP BY substring(A.Referent, 1, 3), substring(B.Referent, 1, 3)) C
    WHERE     NbrLigne <= 3) AS azer ON ref = referenta
    malheureusement ce n'est pas tout a fait le resultat escompté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     Pa	97	    2.0905 %	GOO	12
     Pa	97	    2.0905 %	LVE	9
     Pa	97	    2.0905 %	OVE	8
    CEL	2	    0.0431 %	NEW	1
    DIM	4	    0.0862 %	OVE	8
    DIM	4	    0.0862 %	KEL	4
    DIM	4	    0.0862 %	PRO	4
    ESV	1	    0.0215 %	LOC	1
    ESV	1	    0.0215 %	 Pa	1
    GOO	22	    0.4741 %	 Pa	12
    GOO	22	    0.4741 %	YAH	2
    KEL	12	    0.2586 %	OVE	8
    KEL	12	    0.2586 %	 Pa	7
    KEL	12	    0.2586 %	DIM	4
    LOC	3	    0.0646 %	 Pa	2
    LOC	3	    0.0646 %	ESV	1
    LOC	3	    0.0646 %	LVE	1
    LVE	24	    0.5172 %	 Pa	9
    LVE	24	    0.5172 %	KEL	4
    LVE	24	    0.5172 %	OVE	4
    MIV	3	    0.0646 %	 Pa	3
    NEW	22	    0.4741 %	 Pa	1
    NEW	22	    0.4741 %	CEL	1
    OVE	10	    0.2155 %	PRO	10
    OVE	10	    0.2155 %	 Pa	8
    OVE	10	    0.2155 %	DIM	8
    PRO	5	    0.1077 %	OVE	10
    PRO	5	    0.1077 %	KEL	4
    PRO	5	    0.1077 %	DIM	4
    YAH	4	    0.0862 %	GOO	2
    et non :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pa	97	    2.0905 %	GOO	12	LVE	9O	VE	8
    pour ce qui devrait etre la premiere ligne

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Je ne comprends pas tout, mais il me semble quand même que tu veux transformer des lignes en colonnes, et en plus toutes les références n'ont pas le même nombre de colonnes au final.
    Si c'est cela que tu veux faire, c'est proprement impossible car ce n'est pas le rôle de SQL, il existe des outils de reporting adaptés à ces besoins.

  4. #4
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Salem
    ce genre de requete n'est pas conseillee, il faut simplifier les requetes en creant des vues stockees par exemple.


    tu peut tester ta requete sur des tables importantes et tu veras la lourdeur considerable!

    Bon courage
    Zoheir BOUSSAFI

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 745
    Points : 166
    Points
    166
    Par défaut
    merci de vos conseils mais le probleme c'est que l'on me demande de réaliser cela, quelque soit la lourdeur du processus....

    Et la j'avoue je seche....

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 109
    Points : 28 437
    Points
    28 437
    Par défaut
    Il s'agit là de cosmétique, qui n'est pas le but du langage SQL.
    C'est à l'application de se charger de la mise en forme des données.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Points : 639
    Points
    639
    Par défaut
    Le problème n'est même plus de savoir si c'est lourd ou pas, c'est proprement IMPOSSIBLE !

Discussions similaires

  1. requete complexe sql server
    Par adil_math2006 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 14/06/2007, 10h39
  2. [SQL] Erreur de syntaxe sur requete complexe
    Par tiger33 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/11/2006, 09h54
  3. [SQL Débutant] Requete complexe
    Par pi05 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2006, 12h00
  4. [SQL] comment lié deux requete
    Par Tempotpo dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 19/06/2006, 15h52
  5. problème requete sql fusion de deux count
    Par TuxP dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/12/2005, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo