Requete SQL

bluesman61 Messages postés 4 Date d'inscription samedi 20 novembre 2004 Statut Membre Dernière intervention 6 décembre 2012 - 5 déc. 2012 à 11:47
bluesman61 Messages postés 4 Date d'inscription samedi 20 novembre 2004 Statut Membre Dernière intervention 6 décembre 2012 - 5 déc. 2012 à 15:33
Bonjour,

Sous MySql, j'ai une table qui contient les colonnes suivantes:

logement <---> contrat

1<---> robinetterie
1<---> chaudière
1<---> vmc
2<---> robinetterie
3<---> chaudière

etc ...

Donc pour 1 meme logement, il peut y avoir contrat donc plusieurs lignes dans la table pour 1 meme logement.

Je voudrais que ma requete affiche plusieurs colonnes pour le champ 'contrat' à la manière suivante et ne retourne qu'1 seule ligne par logement :

logement <---> robinetterie<---->chaudière<----->vmc

1<---> robinetterie<---->chaudière<----->vmc (le logt n°1 a 3 contrats)
2<---> robinetterie<---->pas de valeur<----->pas de valeur
3<---> pas de valeur<---->chaudière<----->pas de valeur

je ne sais pas comment procéder. j'arrive a afficher les bon resultats par colonne (comme ci dessous) pour le logement 1 par exemple mais sur 3 lignes alors que je veux agreger sur 1 seule ligne (comme ci dessus)

logement <---> contrat<---->contrat<----->contrat

1<---> robinetterie<---->null<----->null
1<---> null<---->chaudière<----->null
1<---> null<---->null<----->vmc

Cette requete s'effectuera via ODBC sous Excel (en connexion de données).
Avez-vous des idées de code ? cela ne doit pas être compliqué mais je ne sais pas quel methode utliser.
merci d'avance à ceux qui se pencheront sur le sujet.
Cdt

2 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
5 déc. 2012 à 14:26
Salut,

une solution qui n'est pas dynamique telle-quel mais qui a l'avantage d'être simple, c'est de faire autant de jointure externes que de type de contrat, exemple :

SELECT distinct	
t1.logement, t2.typeContrat, t3.typeContrat, t4.typeContrat
FROM 
 #TABLE_TEST t1 
left outer join #TABLE_TEST t2 on t1.logement = t2.logement and t2.typeContrat='Robinetterie'
left outer join #TABLE_TEST t3 on t1.logement = t3.logement and t3.typeContrat='Chaudière'
left outer join #TABLE_TEST t4 on t1.logement = t4.logement and t4.typeContrat='vmc'



En SQLServer, on peut facilement rendre cela dynamique, on peut faire une boucle sur les types de contrats, et créer la requete en mode texte (dynamique), celle-ci s'adaptera si un nouveau type de contrat est créé.
Exemple :
Utilise une table de la forme :
CREATE TABLE #TABLE_TEST (
logement int,
typeContrat varchar(50)
);

/* Début de la requete */  
DECLARE @sqlDyn1 varchar(max) ; SET @sqlDyn1 = ''
DECLARE @sqlDyn2 varchar(max) ; SET @sqlDyn2 = ''
SET @sqlDyn1 = 'SELECT distinct t1.logement '

/* boucle/curseur sur type de contrat */
DECLARE @cpt int ; SET @cpt = 2
DECLARE @tmpContrat varchar(50)
DECLARE myCur CURSOR LOCAL FORWARD_ONLY FOR SELECT distinct typeContrat FROM #TABLE_TEST 
OPEN myCur
FETCH NEXT FROM myCur INTO @tmpContrat
WHILE @@FETCH_STATUS = 0
BEGIN
/* Alias pour la jointure en cours */
DECLARE @alias varchar(3) ; SET @alias = 't'+cast(@cpt as varchar)

/* le select qui évolue */
SET @sqlDyn1 = @sqlDyn1 + ', '+@alias+'.typeContrat '

/* la jointure */
SET @sqlDyn2 = @sqlDyn2 + 
'left outer join #TABLE_TEST '+@alias+' on t1.logement = '+@alias+'.logement and '+@alias+'.typeContrat='''+@tmpContrat+''' '

/* Suivant */
SET @cpt = @cpt + 1
FETCH NEXT FROM myCur INTO @tmpContrat
END
CLOSE myCur
DEALLOCATE myCur

/* Exécute la requete dynamique */
EXECUTE( @sqlDyn1 + ' FROM #TABLE_TEST t1 ' + @sqlDyn2 + ' ORDER BY t1.logement' )


Bye...
0
bluesman61 Messages postés 4 Date d'inscription samedi 20 novembre 2004 Statut Membre Dernière intervention 6 décembre 2012
5 déc. 2012 à 15:33
Salut,

Un grand merci à toi yann_lo_san, ta réponse a été très rapide et très efficace.
et merci également pour le code qui peut rendre la requete dynamique, je n'ai pas tout compris mais je vois le principe et ca peut être pas mal en effet en cas d'ajout de contrat dans la base
Encore merci !
a plus
0
Rejoignez-nous