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 24/12/2010, 15h01   #1
Invité de passage
 
Inscription : novembre 2008
Messages : 8
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 8
Points : 3
Points : 3
Par défaut Confection d'une requete sql

Voila j'ai une base de donée qui contient deux tables :
Adherent et abonne

table adherent contient les colonnes suivantes : CodeAdh,Nom,Prenom,...
table abonne contient les colonnes suivantes : CodeAdh,DateDebut,DateFin,...

bien sur chaque adherent a plusieurs abonnement

je veux une requete qui m'affiche : codeadh,Nom,Prenom et le dernier abonnement de chaque adherent


Cordialement
abdo1966 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 15h58   #2
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
0) ouvrir une requête de sélection
1) mettre les tables en relations avec INNER JOIN
2) ajouter un MAX(DateFin) As DernierAbonnement dans la liste du SELECT
3) faire un GROUP BY sur CodeAdh,Nom,Prenom

... éventuellement bosser un peu le SQL avant de se précipiter dans les forums ...
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 16h21   #3
Invité de passage
 
Inscription : novembre 2008
Messages : 8
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 8
Points : 3
Points : 3
MERCI Népomucène
abdo1966 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2010, 11h09   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 707
Points : 8 707
Bonjour,

Je conçois que pour le débutant l'utilisation du concepteur de requête soit un plus, mais ce n'est pas l'outil le plus précis que l'on peut trouver en ce qui concerne la création d'une requête, surtout dès qu'elle deviennent un peu plus complexe que la demande de ce sujet.

Je ne peux donc que vous conseiller d'ouvrir l'explorateur d'objets de SQL Server Management Studio (SSMS) que vous obtiendrez en pressant F8.
Là la liste des bases de données auxquelles vous avez accès sont affichées, et vous pouvez naviguer à travers les objets de la base de données, notamment les tables, ce qui vous permet d'en connaître la structure.

Ensuite à vous de trouver la méthode qui vous convient le mieux pour écrire vos requêtes.
Je vais vous donner celle que j'utilise après quelques années d'expérience en développement et administration de bases de données.
D'autres l'utilisent également, mais ce n'est pas pour autant que c'est la meilleure et que vous devez absolument la suivre.

D'abord écrire SELECT *, puis FROM, et complétez avec les jointures vers tous les tables dont vous avez besoin pour obtenir le résultat que vous recherchez.
L'alias de table, introduit par le mot clé AS, vous permet de vous faciliter un peu la vie, et d'alléger le texte de votre requête, mais là encore, rien ne vous oblige à les utiliser :

Code :
1
2
3
4
SELECT		*
FROM		dbo.adherent AS ADH
INNER JOIN	dbo.abonne AS ABO
			ON ADH.CodeAdh = ABO.CodeAdh
Ensuite ajoutez les colonnes dont vous avez besoin dans votre SELECT.
Là aussi vous pouvez aliaser vos colonnes :

Code :
1
2
3
4
5
6
SELECT		ADH.Nom AS Nom_Adherent
		, ADH.Prenom AS Prenom_Adherent
		, MAX(DateDebut) AS Date_Dernier_Abonnement
FROM		dbo.adherent AS ADH
INNER JOIN	dbo.abonne AS ABO
			ON ADH.CodeAdh = ABO.CodeAdh
Décorez ensuite la requête avec ce qui est requis, ici la clause GROUP BY :

Code :
1
2
3
4
5
6
7
8
SELECT		ADH.Nom AS Nom_Adherent
		, ADH.Prenom AS Prenom_Adherent
		, MAX(DateDebut) AS Date_Dernier_Abonnement
FROM		dbo.adherent AS ADH
INNER JOIN	dbo.abonne AS ABO
			ON ADH.CodeAdh = ABO.CodeAdh
GROUP BY	ADH.Nom
		, ADH.Prenom
On peut éventuellement ajouter un ORDER BY :

Code :
1
2
3
4
5
6
7
8
SELECT		ADH.Nom AS Nom_Adherent
		, ADH.Prenom AS Prenom_Adherent
		, MAX(DateDebut) AS Date_Dernier_Abonnement
FROM		dbo.adherent AS ADH
INNER JOIN	dbo.abonne AS ABO
			ON ADH.CodeAdh = ABO.CodeAdh
GROUP BY	ADH.Nom, ADH.Prenom
ORDER BY	ADH.Nom, ADH.Prenom
Et éventuellement filtrer l'agrégat :

Code :
1
2
3
4
5
6
7
8
SELECT		ADH.Nom AS Nom_Adherent
		, ADH.Prenom AS Prenom_Adherent
		, MAX(DateDebut) AS Date_Dernier_Abonnement
FROM		dbo.adherent AS ADH
INNER JOIN	dbo.abonne AS ABO
			ON ADH.CodeAdh = ABO.CodeAdh
GROUP BY	ADH.Nom, ADH.Prenom HAVING MAX(DateDebut) > '20101226'
ORDER BY	ADH.Nom, ADH.Prenom
Y'a plus qu'à tester et éventuellement optimiser

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h15.


 
 
 
 
Partenaires

Hébergement Web