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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 26
    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 éprouvé
    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
    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
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 26
    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 confirmé
    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 : 46
    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
    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
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 26
    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 éprouvé
    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
    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.

+ 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