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

MS SQL Server Discussion :

Requête avec clause with


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 26
    Points : 6
    Points
    6
    Par défaut Requête avec clause with
    Bonjour,
    pourquoi ma requête renvoi des AffaireID null alors que dans ma jointure je précise que l'AffaireID est égale à 2993

    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
    WITH T_AFF_MENS
    ( MoisId,  AffaireID,  NbJoursConsoRA, NbJoursValorisesRA)  AS
    (
        SELECT
                M_MAX.MoisID as MoisId,A.AffaireID,
                SUM(ISNULL(LRA.NbJoursConso,0)) AS NbJoursConsoRA,SUM(ISNULL(LRA.NbJoursValorises,0)) AS NbJoursValorisesRA
        from 
            ra.Mois M_MAX
            LEFT JOIN ra.Mois M ON M.DateFin < M_MAX.DateFin
            LEFT JOIN ra.ReleveActivite RA ON RA.MoisID = M.MoisID 
            LEFT JOIN  ra.LigneReleveActivite LRA ON LRA.ReleveActiviteID=RA.ReleveActiviteID
            LEFT JOIN gda.Affaire A ON A.AffaireID=LRA.AffaireID AND ISNULL(LRA.IsValide,0) = 1 
     
            GROUP BY M_MAX.MoisID ,A.AffaireID
     
    )
            SELECT M.DateFin, M.MoisID, F.AffaireID, F.MoisId, ISnull(F.NbJoursConsoRA,0) AS NbJoursConsoRA, isnull(F.NbJoursValorisesRA,0) AS NbJoursValorisesRA --, *
            FROM 
                ra.Mois M  left join T_AFF_MENS F on  F.MoisId = M.MoisID and F.AffaireID=2993
            order by M.DateFin asc
    * Merci *

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Vous utilisez une jointure externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ra.Mois M left join T_AFF_MENS F on F.MoisId = M.MoisID and F.AffaireID=2993
    c'est donc tout à fait normal.

    Vous demandez de sortir toutes les lignes de la table ra.Mois avec une correspondance ou non sur la cte T_AFF_MENS.
    Si vous souhaitez uniquement les lignes correspondantes aux 2 tables, il faut utiliser INNER JOIN (mettre votre filtre dans la clause WHERE fera la même chose).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    FROM
    ra.Mois M INNER JOIN T_AFF_MENS F on F.MoisId = M.MoisID
    WHERE F.AffaireID=2993
    order by M.DateFin asc

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 26
    Points : 6
    Points
    6
    Par défaut Ma clause with
    Merci pour ta réponse, en faite je veux garder la jointure externe
    et à la place des null qui se trouvent dans la colonne AffaireID je veux
    avoir la valeur 2993

    DateFin MoisID AffaireID MoisId NbJoursConsoRA
    30/09/1999 1 NULL NULL 0.00
    31/10/1999 2 NULL NULL 0.00
    30/11/1999 3 NULL NULL 0.00
    31/12/1999 4 NULL NULL 0.00
    30/06/2000 10 NULL NULL 0.00
    31/07/2000 11 NULL NULL 0.00
    30/11/2011 147 2993 147 34.00
    31/12/2011 148 2993 148 54.00
    31/01/2012 149 2993 149 75.00

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Utilise coalesce dans ce cas. Quelque chose du genre :

    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
    WITH T_AFF_MENS
    ( MoisId, AffaireID, NbJoursConsoRA, NbJoursValorisesRA) AS
    (
    SELECT
    COALESCE(M_MAX.MoisID, 2993) as MoisId,A.AffaireID,
    SUM(ISNULL(LRA.NbJoursConso,0)) AS NbJoursConsoRA,SUM(ISNULL(LRA.NbJoursValorises,0)) AS NbJoursValorisesRA
    from 
    ra.Mois M_MAX
    LEFT JOIN ra.Mois M ON M.DateFin < M_MAX.DateFin
    LEFT JOIN ra.ReleveActivite RA ON RA.MoisID = M.MoisID 
    LEFT JOIN ra.LigneReleveActivite LRA ON LRA.ReleveActiviteID=RA.ReleveActiviteID
    LEFT JOIN gda.Affaire A ON A.AffaireID=LRA.AffaireID AND COALESCE(LRA.IsValide,0) = 1 
    
    GROUP BY M_MAX.MoisID ,A.AffaireID
    
    )
    SELECT M.DateFin, M.MoisID, F.AffaireID, F.MoisId, ISnull(F.NbJoursConsoRA,0) AS NbJoursConsoRA, isnull(F.NbJoursValorisesRA,0) AS NbJoursValorisesRA --, *
    FROM 
    ra.Mois M left join T_AFF_MENS F on F.MoisId = M.MoisID and F.AffaireID=2993
    order by M.DateFin asc
    ++

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 26
    Points : 6
    Points
    6
    Par défaut requête avec clause with
    Ça donne le même résultat que sans coalesce , peut être que j'ai oublié quelque chose.

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Pour le code de mikedavem, il s'est trompé sur le positionnement du COALESCE, il l'a placé sur la colonne MoisID au lieu de la colonne AffaireID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M_MAX.MoisID,COALESCE(A.AffaireID, 2993) as AffaireID,
    Cependant, si tu places ce code dans la cte, je pense que tu risques d'avoir des données erronées. Effectivement, il n'y a pas de précision sur AffaireId = 2993 dans cette dernière.

    A mon avis, il faut mettre le COALESCE dans la requête qui retourne les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH T_AFF_MENS
    (
    ...
    )
    SELECT M.DateFin, M.MoisID, COALESCE(F.AffaireID, 2993) AS AffaireID, F.MoisId, ISnull(F.NbJoursConsoRA,0) AS NbJoursConsoRA, isnull(F.NbJoursValorisesRA,0) AS NbJoursValorisesRA --, *
    FROM
    ra.Mois M left join T_AFF_MENS F on F.MoisId = M.MoisID and F.AffaireID=2993
    order by M.DateFin asc
    De manière générale, utiliser COALESCE à la place de ISNULL.

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 26
    Points : 6
    Points
    6
    Par défaut Requête avec clause with
    Merci, effectivement c’était bien ça.
    Maintenant les données sont bonnes

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Yep effectivement trompé de colonne .. donc le raisonnement suit ce que dit SQLDev. Merci d'avoir corrigé

    ++

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

Discussions similaires

  1. requête avec clause LIKE "inversée" ?
    Par shaftJackson dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/02/2013, 21h17
  2. Réponses: 2
    Dernier message: 08/09/2011, 18h20
  3. Réponses: 4
    Dernier message: 26/07/2011, 11h29
  4. sous requête avec clause contrainte
    Par alassanediakite dans le forum Développement
    Réponses: 2
    Dernier message: 24/11/2010, 16h21
  5. Problème dans requête avec clause MAX
    Par tonio-lille dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/10/2007, 17h00

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