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 Server 8] le join ne se fait pas


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut [SQL Server 8] le join ne se fait pas
    hello les amis

    J'utilise SQL Server 8

    je veux faire un join entre une table et le résultat d'un union. Je croyais que ma requete fonctionnait à merveille jusqu'à ce matin où je me suis rendue compte d'un cas d'exception qu'il me faut régler.

    Je vous montre mon code SQL.



    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    declare @marque as varchar(3)
    declare @format as varchar(15)
    declare @groupe as varchar(3)
    declare @devin as varchar(5)
    declare @annee as int
    declare @sem_cour as int
     
    set @marque = 'OAN'
    set @format = 'S24X236ML'
    set @groupe = 'SUP'
    set @devin = '3053'
    set @annee = 2004
    set @sem_cour = 30
     
    select b.semaine, 
    		(case when t_pr_cs.pr_cs IS NULL then 0 else t_pr_cs.pr_cs end) as "PR",
    	   (case when sum(de_cs) IS NULL then 0 else sum(de_cs) end) as "DE"
    from budgetfin b
     inner join
    (
    	 	select semaine, sum(pr_cs) as "pr_cs"
    	 	from budgetfin bf2
    	 	where semaine > @sem_cour and annee = @annee and noclientdevin = @devin and  
              	nomarque = @marque and noformat = @format and nogroupe = @groupe  and type = 'VENTES'
    		group by semaine
     
    	 UNION
    	 	select semaine, sum(pr_qte) as "pr_cs"
    		from statsvente join lassonde.dbo.iim on (iprod = noproduit)
    		where statsvente.semaine <= @sem_cour and statsvente.annee =  @annee   
                    	 and noclientdevin = @devin 
                    	 and imarqu = @marque  
                    	 and iforma = @format  
                    	 and igroup = @groupe
    	group by semaine
     
    	) as t_pr_cs
    on b.semaine = t_pr_cs.semaine 
    where b.annee = @annee and b.noclientdevin = @devin and  
          b.nomarque = @marque and b.noformat = @format and b.nogroupe = @groupe and b.type = 'VENTES'
    group by b.semaine, t_pr_cs.pr_cs
    order by b.semaine
    Les deux tables qui sont jointes sont budgetfin et celle ayant comme alias t_pr_cs.

    Mais voila, je me rend compte que si budgetfin ne possede pas d'enregistrement pour une semaine X, cette semaine la n'apparait pas dans le résultat final, meme si t_pr_cs possede des valeurs pour cette semaine la.


    Comment je sais cela?

    Parce que la section t_pr_cs




    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
    select semaine, sum(pr_cs) as "pr_cs"
    	 	from budgetfin bf2
    	 	where semaine > @sem_cour and annee = @annee and noclientdevin = @devin and  
              	nomarque = @marque and noformat = @format and nogroupe = @groupe  and type = 'VENTES'
    		group by semaine
     
    	 UNION
    	 	select semaine, sum(pr_qte) as "pr_cs"
    		from statsvente join lassonde.dbo.iim on (iprod = noproduit)
    		where statsvente.semaine <= @sem_cour and statsvente.annee =  @annee   
                    	 and noclientdevin = @devin 
                    	 and imarqu = @marque  
                    	 and iforma = @format  
                    	 and igroup = @groupe
    	group by semaine
    me renvoie ceci

    semaine pr_cs
    ------- -----------
    24 1422
    32 0

    (2 row(s) affected)
    Tandis que la section budgetfin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select b.semaine, 
     
    	   (case when sum(de_cs) IS NULL then 0 else sum(de_cs) end) as "DE"
    from budgetfin b
    where b.annee = @annee and b.noclientdevin = @devin and  
          b.nomarque = @marque and b.noformat = @format and b.nogroupe = @groupe and b.type = 'VENTES'
    group by b.semaine
    order by b.semaine
    me renvoie ceci

    semaine DE
    ------- -----------
    32 0

    (1 row(s) affected)
    Mais la requête au complet me renvoie ceci

    semaine PR DE
    ------- ----------- -----------
    32 0 0

    (1 row(s) affected)
    Vous savez comment je pourrais modifier ma requête pour que je puisse obtenir mon 1422 dans le résultat de la requête finale?

    Merci beaucoup!
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  2. #2
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    Les jointure interne (inner join) ne renvoi que les élément qui sont identique (exclu les éléments qui n'ont pas de correspondance).
    Pour inclure ces éléments on peut faire une jointure externe (left outer join ou right outer join)
    Donc remplace ton inner join par la jointure qui faut, et ça devrait marcher (la ligne apparaitra (avec des null pour les éléments non trouvé)

    Salut.

  3. #3
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    Salut Tan

    Merci de ta réponse.

    J'ai beau essayer n'importe quel join j'ai toujours la même réponse : c'est à dire la semaine 32 avec 0 caisses :



    semaine PR DE
    ------- ----------- -----------
    32 0 0

    (1 row(s) affected)

    j'ai essayé :

    - left outer join
    - right outer join
    - inner join
    - full outer join
    - full join

    toujours la meme reponse...

    je crois que mon probleme vient du on semaine = semaine. Je join sur le numéro de semaine.

    Peut etre :
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  4. #4
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    Je pense qu'un right outer join devrait marcher et donner(sinon mets left à la place:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    semaine   PR    DE
        32    0      0
        24  1042  null
    Je vais regarder d'un peu plus près, en attendant, pour vérifier, fais ça:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    declare @marque as varchar(3) 
    declare @format as varchar(15) 
    declare @groupe as varchar(3) 
    declare @devin as varchar(5) 
    declare @annee as int 
    declare @sem_cour as int 
     
    set @marque = 'OAN' 
    set @format = 'S24X236ML' 
    set @groupe = 'SUP' 
    set @devin = '3053' 
    set @annee = 2004 
    set @sem_cour = 30 
     
    select b.semaine, 
          (case when t_pr_cs.pr_cs IS NULL then 0 else t_pr_cs.pr_cs end) as "PR", 
          (case when sum(de_cs) IS NULL then 0 else sum(de_cs) end) as "DE" 
    from budgetfin b 
     right outer join 
    ( 
           select semaine, sum(pr_cs) as "pr_cs" 
           from budgetfin bf2 
           where semaine > @sem_cour and annee = @annee and noclientdevin = @devin and  
                 nomarque = @marque and noformat = @format and nogroupe = @groupe  and type = 'VENTES' 
          group by semaine 
     
        UNION 
           select semaine, sum(pr_qte) as "pr_cs" 
          from statsvente join lassonde.dbo.iim on (iprod = noproduit) 
          where statsvente.semaine <= @sem_cour and statsvente.annee =  @annee    
                        and noclientdevin = @devin 
                        and imarqu = @marque  
                        and iforma = @format  
                        and igroup = @groupe 
       group by semaine 
     
       ) as t_pr_cs 
    on b.semaine = t_pr_cs.semaine 
    where b.annee = @annee and b.noclientdevin = @devin and  
          b.nomarque = @marque and b.noformat = @format and b.nogroupe = @groupe and b.type = 'VENTES' 
    group by b.semaine, t_pr_cs.pr_cs 
    order by b.semaine

  5. #5
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    toujours la meme chose, c'est a dire pas la bonne réponse.
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  6. #6
    Tan
    Tan est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 168
    Points : 158
    Points
    158
    Par défaut
    Cela m'étonne vraiment beaucoup...
    Essaies de créer 2 tables comportant les résultats de tes deux sous requêtes, et fais une jointure entre les deux nouvelles tables pour vérifier.
    Normalement, tu auras le bon résultat, sinon c'est un problème de syntaxe avec SQL SERVER (moi je suis sous ACCESS, mais je faisait comme ça avant sous SQL SERVER)

    Enfin, le fait de faire de petite table, simplifiera la requ^te et sera peut être plus simple à corriger.

  7. #7
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    Bonjour, je suis de retour sur mon probleme (je suis au travail alors je dois parfois laisser des projets de côté pour régler des cas plus important).

    Si jamais vous avez des idées ne vous gênez pas pour m'en faire part!

    Je reviendrai vous voir si j'ai des developpements.

    Merci à l'avance pour votre précieuse aide
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  8. #8
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    Bon d'accord tel que proposé par TAN j'ai fais deux petites tables

    ce qui était avant t_pr_cs est maintenant la table temp et la table budgetfin est maintenant la table temp2.

    si je fais

    j'ai ceci

    semaine PR_CS
    ------- -----------
    24 1422
    si je fais

    j'obtiens ceci

    semaine DE BC
    ------- ----------- -----------
    c'est à dire rien.

    Bref je veux juste lier les deux tables pour avoir un resultat de ce genre :

    semaine de bc pr
    24 0 0 1422

    si je fais cela comme requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from jasstemp join jasstemp2 on (jasstemp.semaine = jasstemp2.semaine)
    ca me donne encore et toujours un résultat vide

    semaine PR_CS semaine DE BC
    ------- ----------- ------- ----------- -----------

    (0 row(s) affected)
    quelqu'un a une idée?
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  9. #9
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    à force de taponner je viens de trouver ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select temp.semaine, pr_cs, de, bc from temp full outer join temp2 on (temp.semaine = temp2.semaine)
    ca me donne cela

    semaine pr_cs de bc
    ------- ----------- ----------- -----------
    24 1422 NULL NULL

    (1 row(s) affected)
    mais si je l'applique à ma grosse requête du début ca ne fonctionne pas.....
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

  10. #10
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    tu as aussi dans ta requête ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    where b.annee = @annee and b.noclientdevin = @devin and  
          b.nomarque = @marque and b.noformat = @format and b.nogroupe = @groupe and b.type = 'VENTES'
    qui peuvent r'eliminer les lignes que tu ramène avec OUTER.

    je pense aussi qu'un Left Outer join suffit pour ton problème.

    A+

  11. #11
    Membre habitué Avatar de Baquardie
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Juillet 2003
    Messages : 267
    Points : 144
    Points
    144
    Par défaut
    BON Je crois bien avoir solutionnée mon problème -- enfin!!

    MAMMAR -- ton point était excellent. C'était ça aussi qui me chicotait, le where à la fin de ma requête.

    Tan -- ton idée de ramener ma requête à plus petit m'a vraiment aidée. Je l'ai regrossie petit à petit me permettant de tester au fur et à mesure que j'ajoutais des éléments.

    Voilà donc ma requête finale....

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    declare @annee as varchar(4)
    declare @devin as varchar(5)
    declare @marque as varchar(3)
    declare @format as varchar(10)
    declare @groupe as varchar(3)
    declare @type as varchar(6)
    declare @semaine as int
     
    set @annee = 2004
    set @devin = '3053'
    set @marque = 'OAN'
    set @format = 'S24X236ML'
    set @groupe = 'SUP'
    set @type  = 'VENTES'
    set @semaine = 30
     
     
    select (case when b.semaine is null then c.semaine else b.semaine end) as 'Semaine',
    		(case when sum(c.pr_cs) is null then 0 else sum(c.pr_cs) end) as 'PR', 
    		(case when sum(b.de) is null then 0 else sum(b.de) end) as 'DE',
    		(case when sum(b.bc) is null then 0 else sum(b.bc) end) as 'BC'
    from (
    		select semaine, de_cs as 'de', bc_cs as 'bc' from lassondetraiteur.dbo.budgetfin 
    		where annee = @annee and noclientdevin = @devin and  
    	      nomarque = @marque and noformat = @format and nogroupe = @groupe  
    	      and type = @type  
    		) as b
     
    full outer join 
    (  
       select semaine, sum(pr_cs) as 'PR_CS'  
    	from budgetfin bf2
       where semaine >  @semaine  and annee = @annee and noclientdevin = @devin and  
            nomarque = @marque and noformat = @format and nogroupe = @groupe and type = @type 
       group by semaine  
      Union  
       select semaine, sum(pr_qte) as 'PR_CS'  
       from  lassondetraiteur.dbo.statsvente join  lassonde.dbo.iim on (iprod = noproduit)  
       where statsvente.semaine <=  @semaine  And statsvente.Annee = @annee  
             and noclientdevin = @devin  
             and imarqu = @marque  
             and iforma = @format  
             and igroup = @groupe group by semaine  
    ) as c  
    on (b.semaine = c.semaine)
    group by b.Semaine, c.semaine
    order by b.semaine
    et ca me donne ceci comme réponse

    Semaine PR DE BC
    ------- ----------- ----------- -----------
    24 1422 0 0
    32 0 0 0

    (2 row(s) affected)

    Warning: Null value is eliminated by an aggregate or other SET operation.
    4 secondes a exécuter... ce n'est pas très optimal par contre Je regarderai peut être un peu plus tard pour optimiser ma méthode mais au moins pour l'instant cela fonctionne!

    Merci beaucoup!!
    Rien n'est impossible à celui qui n'a pas à le faire
    DBA. Je travaille avec SQL-9, SQL-10

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2014] Installation SQL Server Express 2014 qui ne se lance pas
    Par Maduc dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/01/2015, 11h48
  2. Probleme de joins, il ne fait pas la liaison tout seul
    Par speed034 dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 02/03/2011, 01h23
  3. [SQL SERVER 2K8] les services ne se lancent pas
    Par mayce dans le forum Administration
    Réponses: 7
    Dernier message: 11/02/2010, 14h49
  4. ms sql server 2000 : ".exe" qui ne s'exécute pas
    Par nyko_kliko dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/08/2006, 16h15
  5. Réponses: 4
    Dernier message: 08/06/2006, 13h18

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