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 :

Requête qui me pose problème (suite)


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut Requête qui me pose problème (suite)
    Bonjour à toutes et à tous.
    La requête qu'avait proposé @aieeeuuuuu donnait le résultat espéré. J'ai juste rajouté un ordre de classement après les jointures internes. Donc voici à nouveau cette requête :
    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
    WITH CTE AS (
      SELECT 
        S.suj_titre AS Titre,
        COUNT(*) OVER (PARTITION BY S.suj_id) AS NbReponses,
        Auteur.uti_nom AS Auteur, 
        ROW_NUMBER() OVER(
              PARTITION BY S.suj_id
              ORDER BY R.rep_date DESC, R.rep_heure DESC
          ) AS RangReponse,
        U.uti_Nom AS NomRepondeur
      FROM t_e_sujets_suj S
      INNER JOIN t_e_utilisateurs_uti Auteur
        ON Auteur.uti_id = S.uti_id
      INNER JOIN  t_e_reponses_rep R
        ON R.suj_id = S.suj_id
      INNER JOIN t_e_utilisateurs_uti U
        ON U.uti_id = R.uti_id
      ORDER BY S.suj_date DESC
     )
    SELECT Titre, NbReponses, Auteur, NomRepondeur
    FROM CTE
    WHERE RangReponse = 1;
    J'avais mal décrit le problème à traiter, en ce sens qu'il peut y avoir des messages qui n'ont pas suscité de réponses et qu'il faut faire apparaître dans la liste avec bien évidemment un 0 dans la colonne NbReponse. Comme je ne comprends pas la requête précédente, je ne m'en sort pas tout seul!
    J'ai bien changé, à l'aveuglette, les deux dernières jointures en LEFT OUTER JOIN, ce qui fait apparaître le message sans réponse mais avec un nombre de réponse égal à 1 et non 0.
    En attendant une réponse à mon problème, je potasse les PARTITION BY, retravaille les jointures que je croyais avoir comprises et d'autres points importants du SQL.
    Merci d'avance pour vos réponses.

    Miflon

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Oui vous devez utiliser des jointures externes, par contre count(*) compte les lignes et il y a bien une ligne sans réponse donc 1.
    Vous devez utiliser count(colonne) qui ne compte pas les NULLs.

    Par exemple count(R.suj_id) OVER (PARTITION BY S.suj_id) AS NbReponses,

  3. #3
    Membre régulier
    Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 101
    Points : 80
    Points
    80
    Par défaut
    Le sujet est résolu. Grâce à vous, @aieeeuuuuu et skuatamad!
    J'ai complété la requête en récupérant la date et l'heure de la dernière réponse relative à chaque sujet.
    Voici la requête finale répondant à mon questionnement.
    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
     
    WITH CTE AS (
      SELECT 
        S.suj_titre AS Titre,
        COUNT(R.suj_id) OVER (PARTITION BY S.suj_id) AS NbReponses,
        Auteur.uti_nom AS Auteur, 
        ROW_NUMBER() OVER(
              PARTITION BY S.suj_id
              ORDER BY R.rep_date DESC, R.rep_heure DESC
          ) AS RangReponse,
        R.rep_date AS DateRep,
        R.rep_heure As HeureRep,
        U.uti_Nom AS NomRepondeur
      FROM t_e_sujets_suj S
      INNER JOIN t_e_utilisateurs_uti Auteur
        ON Auteur.uti_id = S.uti_id
      LEFT OUTER JOIN  t_e_reponses_rep R
        ON R.suj_id = S.suj_id
      LEFT OUTER JOIN t_e_utilisateurs_uti U
        ON U.uti_id = R.uti_id
      ORDER BY S.suj_date DESC
     )
    SELECT Titre, NbReponses, Auteur, NomRepondeur, DateRep, HeureRep
    FROM CTE
    WHERE RangReponse = 1;
    Merci encore à tous les deux et à tous ceux qui prennent le temps de répondre à nos demandes d'aide.

    Miflon.

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

Discussions similaires

  1. Requête qui me pose problème
    Par Miflon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2013, 14h02
  2. Une requete qui pose problème (suite !)
    Par supertoms dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2008, 09h10
  3. Toggle qui me pose problème
    Par Ben-o dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/10/2007, 09h24
  4. Requête SQL qui me pose problème
    Par CB56 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/02/2007, 16h07
  5. un trait qui me pose problème
    Par barbapapa2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/11/2006, 12h32

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