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 :

Requete sur une correspondance


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 0
    Points
    0
    Par défaut Requete sur une correspondance
    Bonjour,
    Je ne m'en sors pas de ma requete SQL (server 2008) pour la procedure stockée (et pourtant c'est simple).


    J'ai une table de messages avec les colonnes :
    "Expéditeur / Destinataire / Date / Message"

    Je peux donc avoir plusieurs lignes dedans comme :
    "Expéditeur / Destinataire / Date / Message"
    ---------------------------------------
    Pierre / Marc / 15 mai / xxx
    Pierre/ Marc / 17 mai / yyy
    ou même à l'envers si j'ai :
    Marc / Pierre / 16 mai / zzz
    (Car ce n'est pas toujours Pierre qui écrit à Marc, Marc peut aussi écrire à Pierre.
    Tout comme Pierre peut aussi ecrire à Simon :
    Pierre / Simon / 2 juin / nnn

    Ce qui m'intéresse, c'est de faire une requete qui me donne la page de "correspondance" de Pierre. Donc juste les correspondances de pierre avec les autres ou des autres avec pierre.

    En sortie je voudrais une table aux colonnes :
    "Date / Correspondant / Nb Messages"

    Donc si je prends les données de ce que j'ai cité, ca devrait me rendre :

    "Date / Correspondant / Nb Messages"
    ------------------------------------------

    2 juin / Simon / 1
    17 mai / Marc / 3


    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With SR as (
    	select Expéditeur as usager1, Destinataire as usager2, Date from ma_table
    	union all 
    	select Destinataire as usager1, Expéditeur as usager2, Date from ma_table
    )
    select date, usager1 usager_recherche, usager2 usager_correspondant, count(*) as [Nb Messages]
    from SR 
    where usager1 = 'Pierre'
    group by date, usager1, usager2
    Je n'ai pas testé et j'ai l'impression de faire compliqué mais ça devrait répondre à ton besoin, tout en étant une requête généralisable pour tous les usagers si tu retires la clause where.

    À noter que je n'ai pas gérer le cas où Machin s'écrit à lui-même...

  3. #3
    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
    Bonjour,

    Une solution plus simple peut etre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
     expediteur, destinataire, date_operation, COUNT(*) AS nb_message
    FROM dbo.maTable
    WHERE expediteur = 'Pierre'
     OR destinataire = 'Pierre'
    GROUP BY expediteur, destinataire, date_operation
    ORDER BY date_operation;
    ++

  4. #4
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Bonjour,

    Une solution plus simple peut etre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
     expediteur, destinataire, date_operation, COUNT(*) AS nb_message
    FROM dbo.maTable
    WHERE expediteur = 'Pierre'
     OR destinataire = 'Pierre'
    GROUP BY expediteur, destinataire, date_operation
    ORDER BY date_operation;
    ++

    Et pour avoir le résultat sur 3 champs, comme demandé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
     case when expediteur = 'Pierre' then destinataire else expediteur end as Correspondant, date_operation, COUNT(*) AS nb_message
    FROM dbo.maTable
    WHERE expediteur = 'Pierre'
     OR destinataire = 'Pierre'
    GROUP BY case when expediteur = 'Pierre' then destinataire else expediteur end, date_operation
    ORDER BY date_operation;

  5. #5
    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
    Bon globalement on pourrait aussi voir s'il est pas intéressant de faire des union all pour pouvoir profiter d'éventuels index de la table au lieu d'avoir des prédicats à base de OR.

    ++

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 0
    Points
    0
    Par défaut
    Merci pour vos réponse, on approche du resultat meme si c'est pas encore ca.

    En prenant la technique de "7gyY9w1ZY6ySRgPeaefZ", la requete adaptée est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	with sr as (
    	SELECT 	Message.IDSource as usager1, Message.IDDest as usager2, message.DateWrite as madate, COUNT(*) as compte from dbo.Message group by Message.IDSource, Message.IDDest, message.DateWrite
    	union all
    	SELECT 	Message.IDDest as usager1, Message.IDSource as usager2, message.DateWrite as madate, COUNT(*)as compte  from dbo.Message group by Message.IDSource, Message.IDDest, message.DateWrite
    	)
    	select  madate, usager2, count(*) as NBMessages from sr 
    	where usager1 = 'pierre'
    	group by     usager2 , madate
    	order by madate desc
    Mais cela me répond toutes les lignes de correspondant avec le meme correspondant, le resultat des correspondances de pierre est :
    date/usager2/Nbmessages
    -----------------------------
    17 jan / emilie / 1
    16 jan / emilie / 1
    15 jan / emilie / 1
    5 jan / marcel / 1
    1 jan / francis / 1
    En, fait j'aimerai avoir :
    17 jan / emilie / 3
    5 jan / marcel / 1
    1 jan / francis / 1



    En prenant le modele de SLE la requete est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	SELECT 
    	case when Message.IDSource = 'pierre' then Message.IDDest else Message.IDSource end as correspondant, message.DateWrite, COUNT(*) from dbo.Message
    	where Message.IDSource = 'pierre' or Message.IDDest='pierre'
    	group by case when Message.IDSource='pierre' then Message.IDDest else Message.IDSource end, Message.DateWrite
    	order by  Message.DateWrite desc

    Le résultat est :
    Correspondant / Date / NBmess
    ------------------------------
    emilie / 17 jan / 1
    emilie / 16 jan / 1
    emilie / 15 jan / 1
    marcel / 5 jan / 1
    francis / 2 jan / 1
    Et donc je voudrais avoir :
    emilie / 17 jan / 3
    marcel / 5 jan / 1
    francis / 2 jan / 1

    Merci pour vos nouveaux conseils.

  7. #7
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Citation Envoyé par panza Voir le message
    Le résultat est :
    Correspondant / Date / NBmess
    ------------------------------
    emilie / 17 jan / 1
    emilie / 16 jan / 1
    emilie / 15 jan / 1
    marcel / 5 jan / 1
    francis / 2 jan / 1

    Et donc je voudrais avoir :
    emilie / 17 jan / 3
    marcel / 5 jan / 1
    francis / 2 jan / 1
    Comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from
    (
    SELECT
    case when Message.IDSource = 'pierre' then Message.IDDest else Message.IDSource end as correspondant, max(message.DateWrite) as DateWrite, COUNT(*) from dbo.Message
    where Message.IDSource = 'pierre' or Message.IDDest='pierre'
    group by case when Message.IDSource='pierre' then Message.IDDest else Message.IDSource end
    ) as tmp
    order by DateWrite desc

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 0
    Points
    0
    Par défaut
    Excellent SLE !
    Merci

  9. #9
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Juste pour info, pour mettre la discussion en Résolu, il ne faut pas éditer le titre mais cliquer sur le bouton "Résolu"

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 0
    Points
    0
    Par défaut
    Ben ca tombe bien car en fait ce n'est pas résolu...
    Pour ce que j'ai énoncé, c'est bon, j'ai bien :

    emilie / 17 jan / 3
    marcel / 5 jan / 1
    francis / 2 jan / 1

    Mais dans ma table de messages j'ai d'autres champs :
    Lu : champ date qui contient la date a laquelle le message a été lu. Reste à 'null' si non lu

    Dans le résultat j'ai besoin d'une autre colonn epour dire si le message a été lu.
    Si le dernier n'est pas lu (par exemple dans la derniere réponse de emilie), je veux que cela apparaisse avec un lu à 0 ou un nonlu à 1
    Cela me permettra de mettre la ligne de ce correspondant en surbrillance, s'il reste un msg a lire.

    Merci

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SLE Voir le message
    Comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from
    (
    SELECT
    case when Message.IDSource = 'pierre' then Message.IDDest else Message.IDSource end as correspondant, max(message.DateWrite) as DateWrite, COUNT(*) from dbo.Message
    where Message.IDSource = 'pierre' or Message.IDDest='pierre'
    group by case when Message.IDSource='pierre' then Message.IDDest else Message.IDSource end
    ) as tmp
    order by DateWrite desc
    pourquoi faire une sous-requête là ?
    Autant faire simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    	case 
    		when Message.IDSource = 'pierre' then Message.IDDest 
    		else Message.IDSource end as correspondant, 
    	max(message.DateWrite) as DateWrite, 
    	COUNT(*) Quantite
    from dbo.Message
    where Message.IDSource = 'pierre' 
    	or Message.IDDest='pierre'
    group by case when Message.IDSource='pierre' then Message.IDDest else Message.IDSource end
    order by max(message.DateWrite) desc

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 0
    Points
    0
    Par défaut
    Merci
    Mais ca ne résoud pas mon probleme de faire apparaitre si une corresponance contient un ou plusieurs messages non lus.
    Quelle solution adopter ?
    Merci de votre aide

  13. #13
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH SR AS (
    	SELECT Expéditeur AS usager1, Destinataire AS usager2, Date, case when date_lue is null then 1 else 0 end AS lu FROM ma_table
    	union ALL 
    	SELECT Destinataire AS usager1, Expéditeur AS usager2, Date, case when date_lue is null then 1 else 0 end AS lu FROM ma_table
    )
    SELECT date, usager1 usager_recherche, usager2 usager_correspondant, count(*) AS [Nb Messages] , sum(lu) nbre_courriels_lus
    FROM SR 
    WHERE usager1 = 'Pierre'
    GROUP BY date, usager1, usager2

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 0
    Points
    0
    Par défaut
    Si je retranscris ton code avec mes noms de champ cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH SR AS (
    	SELECT Message.IDSource AS usager1, Message.IDDest AS usager2, message.DateWrite, case when message.DateRead IS NULL then 1 else 0 end AS lu FROM dbo.Message
    	union ALL 
    	SELECT Message.IDDest  AS usager1,  Message.IDSource AS usager2, message.DateWrite, case when message.DateRead IS NULL then 1 else 0 end AS lu FROM dbo.Message
    )
    SELECT DateWrite, usager1 usager_recherche, usager2 usager_correspondant, count(*) AS [Nb Messages] , sum(lu) nbre_courriels_lus
    FROM SR 
    WHERE usager1 = 'Pierre'
    GROUP BY DateWrite, usager1, usager2

    Mais la ca ne va pas du tout. Le résultat liste toutes les lignes :
    date                                  u1                u2      nbMes  nbLus     
    2011-01-15 00:00:00.000	pierre	emilie	1	0
    2011-01-17 00:00:00.000	pierre	emilie	1	0
    2011-01-18 00:00:00.000	pierre	emilie	1	1
    2011-01-01 00:00:00.000	pierre	francis	1	1
    2011-01-05 00:00:00.000	pierre	marcel	1	0

  15. #15
    Invité
    Invité(e)
    Par défaut
    Dites donc, rien ne vous empêche aussi de travailler de votre côté ce qui a été mis à votre disposition, au lieu d'attendre que ça vous tombe tout cru dans le bec...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH SR AS (
    SELECT Message.IDSource AS usager1, Message.IDDest AS usager2, message.DateWrite, case when message.DateRead IS NULL then 1 else 0 end AS lu FROM dbo.Message
    union ALL
    SELECT Message.IDDest AS usager1, Message.IDSource AS usager2, message.DateWrite, case when message.DateRead IS NULL then 1 else 0 end AS lu FROM dbo.Message
    )
    SELECT max(DateWrite) max_datewrite, usager1 usager_recherche, usager2 usager_correspondant, count(*) AS [Nb Messages] , sum(lu) nbre_courriels_lus
    FROM SR
    WHERE usager1 = 'Pierre'
    GROUP BY usager1, usager2

Discussions similaires

  1. requete sur une date..
    Par kenny49 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/06/2006, 13h48
  2. DOUBLE REQUETE SUR UNE MEME TABLE
    Par MORAS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/01/2006, 13h40
  3. Requete sur une table qui pointe 2 fois sur une autre
    Par Satch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/01/2006, 08h48
  4. Réponses: 9
    Dernier message: 18/08/2005, 13h16
  5. Requete sur une proc stockée
    Par jeff37 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/04/2005, 00h56

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