Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/10/2011, 20h35   #1
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : -1
Points : -1
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
panza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 20h52   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 522
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 522
Points : 3 970
Points : 3 970
Code :
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...
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 22h51   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Bonjour,

Une solution plus simple peut etre ?

Code :
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;
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/10/2011, 08h43   #4
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Citation:
Envoyé par mikedavem Voir le message
Bonjour,

Une solution plus simple peut etre ?

Code :
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 :
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;
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 10h25   #5
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
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.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 13h30   #6
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : -1
Points : -1
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 :
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 :
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.
panza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 14h02   #7
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
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 :
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
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 17h11   #8
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : -1
Points : -1
Excellent SLE !
Merci
panza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 18h10   #9
SLE
Membre chevronné
 
Avatar de SLE
 
Homme Serge LESPAGNARD
Consultant informatique
Inscription : janvier 2004
Messages : 588
Détails du profil
Informations personnelles :
Nom : Homme Serge LESPAGNARD
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : janvier 2004
Messages : 588
Points : 732
Points : 732
Juste pour info, pour mettre la discussion en Résolu, il ne faut pas éditer le titre mais cliquer sur le bouton "Résolu"
SLE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 18h14   #10
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : -1
Points : -1
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
panza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 19h24   #11
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 522
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 522
Points : 3 970
Points : 3 970
Citation:
Envoyé par SLE Voir le message
Comme ceci
Code :
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 :
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
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 19h52   #12
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : -1
Points : -1
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
panza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 20h07   #13
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 522
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 522
Points : 3 970
Points : 3 970
Code :
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
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 20h21   #14
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : -1
Points : -1
Si je retranscris ton code avec mes noms de champ cela donne :

Code :
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
panza est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/10/2011, 20h56   #15
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 522
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 522
Points : 3 970
Points : 3 970
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 :
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
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h19.


 
 
 
 
Partenaires

Hébergement Web