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 :

SELECT DISTINCT avec 2 champ


Sujet :

Langage SQL

  1. #1
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut SELECT DISTINCT avec 2 champ
    Bonjour,

    j'ai une table qui contient entre autre

    - id d'un candidat (CID)
    - date de suivi (Date_suivi)
    - id type suivi (TID)

    j'aimerais sellectionner des couples CID - Date_suivi, avec une condition dans le type de suivi.

    je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT     CID, Date_suivi
    FROM         t_RCTMT_suivi
    WHERE     (TID = 1) OR
                          (TID = 2)
    • 30 7/03/2007 16:21:12
    • 43 7/03/2007 16:44:43
    • 61 7/03/2007 16:47:34
    • 254 7/03/2007 16:48:28


    Mais j'aimerais n'avoir en résultat que le premier hit sur un CID.
    Donc lorsqu'il y a plusieurs lignes avec par exemple le CID "25", seul le premier couple CID-Date_suivi avec 25 est retenu.

    je pensais qu'en faisant ceci (2ème citation) ca allait se faire seul, mais il me sort n'importe quoi comme résultat, avec entre autre plusieurs ligne avec le CID "25":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT CID, Date_suivi
    FROM         t_RCTMT_suivi
    WHERE     (TID = 1) OR
                          (TID = 2)
    vu le nombre de lignes renvoyées, il me sortirait apparemment exactement la même chose avec et sans le "DISTINCT", mais lorsque je le met, il me trie et groupe les couples par CID, ce qui n'est pas ce que je souhaite.

    • 25 28/03/2007 10:51:21
    • 25 4/04/2007 15:04:31
    • 30 7/03/2007 16:21:12
    • 40 4/04/2007 20:12:19


    Pouvez vous m'indiquer comme réaliser cela?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Citation Envoyé par cortex024
    Mais j'aimerais n'avoir en résultat que le premier hit sur un CID.
    Donc lorsqu'il y a plusieurs lignes avec par exemple le CID "25", seul le premier couple CID-Date_suivi avec 25 est retenu.
    Sur quel critère déterminer LA ligne à retourner s'il y en a plusieurs ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    un petit exemple possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  CID, max(Date_suivi)
    FROM         t_RCTMT_suivi
    WHERE     TID in (1, 2)
    group by CID
    Comme le dis al1_24, il faut un critere pour savoir quelle Date_suivi sélectionner (la plus recente, la plus ancienne, autre critere?)

  4. #4
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    Citation Envoyé par al1_24
    Sur quel critère déterminer LA ligne à retourner s'il y en a plusieurs ?

    la première dans le temps (donc par ordre d'id, ou encore par ordre de Date_suivi)

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  t1.cid
        ,   MIN(t1.date_suivi)
    FROM    t_rctmt_suivi   AS t1 
    WHERE   t1.tid IN (1, 2)
    GROUP BY
            t1.cid
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    Merci al1_24, cela fonctionne et me donne le résultat escompté.

    Maintenant que j'ai ce tableau "CID-Date_suivi", je dois aller rechercher dans une autre table une autre date correspondant à ce CID (dans cette autre table, les lignes de CID sont uniques).

    j'ai toujorus tendance à faire beaucoup en prog, mais j'aimerais m'améliorer en sql car il y a beaucoup de possibilités.

    A partir du tableau obtenu, je dois en fait comparer la date (Date_suivi) correspondant à l'ID (CID), avec une date trouvée dans une autre table (trouver la différence de jours).

    dans cette autre table, une seule ligne par CID, donc facile à trouver:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT autre_Date
    FROM autre_table
    WHERE ID= X
    X étant le CID trouvé dans la première requête)

    Je ne sais pas si c'est possible en SQL sans passer par une manipulation/traitement en prog?


    je pensais faire comme ceci:

    - Executer la première requête et remplir un tableau, dataset,...
    - parcourir ce tablea/dataset et pour chaque ligne, executer une requete qui va aller chercher dans l'autre table la date correspondant à la colonne CID, et soustraire les 2 dates afin d'en retirer un nombre de jours, et stocker ce nombre de jours quelque part
    - faire la moyenne de cette différence de jours, vu que c'est le but de la manipulation.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  t1.cid
        ,   MIN(t1.date_suivi)
        ,   t2.autre_date
    FROM    t_rctmt_suivi   AS t1
        INNER JOIN
            autre_table     AS t2
            ON  t1.cid = t2.cid 
    WHERE   t1.tid IN (1, 2)
    GROUP BY
            t1.cid
        ,   t2.autre_date
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    ca fonctionne


    ps1: j'avais édité mon message précédent pendant que tu répondais, y a des infos en plus sur le but final

    ps2: pourquoi doit on ajouter une 2ème clause dans le GROUP BY (ici t2.autredate) ?

  9. #9
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    j'ai donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT     t1.CID, MIN(t1.Date_suivi) AS Date_suivi, t2.CDate
    FROM         t_RCTMT_suivi AS t1 INNER JOIN
                          t_RCTMT_Candidat AS t2 ON t1.CID = t2.CID
    WHERE     (t1.TID IN (1, 2))
    GROUP BY t1.CID, t2.CDate
    qui me donne une colonne ID, et mes 2 colonnes de dates.

    il faut que je calcule la différence de jours entre ces 2 dates, et en faire la moyenne!

    pour calculer la différence de jour, je fais avec datediff:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT     t1.CID, MIN(t1.Date_suivi) AS Date_suivi, t2.CDate, DATEDIFF(day, t2.CDate, t1.Date_suivi) AS diff
    FROM         t_RCTMT_suivi AS t1 INNER JOIN
                          t_RCTMT_Candidat AS t2 ON t1.CID = t2.CID
    WHERE     (t1.TID IN (1, 2))
    GROUP BY t1.CID, t2.CDate
    Mais il ne veut pas, il veut alors que mon t1.Date_suivi soit aussi dans la clause GROUP BY.

    Et si je le fais, je n'ai plus du tout le même nombre de record.

    Pourquoi devoir mettre ca dans un GROUP BY, pourquoi ne puis je pas ajouter ce champ calculé simplement?

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Soyez cohérent, faites le calcul avec la date que vous avez choisie...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT     t1.CID, MIN(t1.Date_suivi) AS Date_suivi, t2.CDate, DATEDIFF(day, t2.CDate, MIN(t1.Date_suivi)) AS diff
    FROM         t_RCTMT_suivi AS t1 INNER JOIN
                          t_RCTMT_Candidat AS t2 ON t1.CID = t2.CID
    WHERE     t1.TID IN (1, 2)
    GROUP BY t1.CID, t2.CDate
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut


    Si je veux faire la moyenne de cette colonne diff?

    apparemment la fonction AVG permet de faire une moyenne.

    Une moyenne sur une colonne d'une table, j'ai trouvé.

    mais je n'ai pas trouvé d'exemple sur le net pour réaliser une moyenne sur une colonne calculée via une requête SELECT, comme ici la colonne diff.

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Il suffit de rajouter une couche !
    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  AVG(diff)   AS moyenne
    FROM
        (   SELECT  t1.cid
                ,   MIN(t1.date_suivi) AS date_suivi
                ,   t2.cdate
                ,   datediff(day, t2.cdate, MIN(t1.date_suivi)) AS diff
            FROM    t_rctmt_suivi AS t1 
                INNER JOIN
                    t_rctmt_candidat AS t2 
                    ON  t1.cid = t2.cid
            WHERE   t1.tid IN (1, 2)
            GROUP BY t1.cid
                ,   t2.cdate
        )   AS tmp
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  13. #13
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    Magnifique.


    Je fais trop souvent ce genre de travail en programmation, vive le SQL!

    merci de tes réponses.

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

Discussions similaires

  1. [MySQL] DISTINCT avec 2 champs
    Par celinedecham dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/10/2008, 21h08
  2. Select Distinct avec image (Version 10G)
    Par serge0934 dans le forum SQL
    Réponses: 2
    Dernier message: 01/02/2008, 12h01
  3. Pbm selection distinct avec jonction de table
    Par BernardT dans le forum Langage SQL
    Réponses: 1
    Dernier message: 18/07/2007, 11h05
  4. select distinct sur 2 champs
    Par alexkickstand dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/07/2007, 18h19
  5. SELECT DISTINCT avec tri sur un autre champ que celui du distinct
    Par Stephane_br dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/11/2006, 11h37

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