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)
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
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 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' )
bluesman61
Messages postés4Date d'inscriptionsamedi 20 novembre 2004StatutMembreDerniè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