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 avec champs identiques & cumuler champs différents


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut Requete avec champs identiques & cumuler champs différents
    Bonsoir à tous,

    Désolé pour le titre pas très explicite mais je ne sais pas comment expliquer clairement ma demande.

    Pour faire simple, voici le résultat de ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    voiture	     couleur1	porte 	 option
    voiture1	rouge	5	clim
    voiture1	rouge	5	lecteur cd
    voiture1	rouge	5	toit ouvrant
    voiture1	rouge	5	gante
    voiture1	rouge	5	siege cuir
    voiture2	vert	3	clim
    voiture2	vert	3	lecteur cd
    voiture2	vert	3	toit ouvrant
    voiture2	vert	3	gante
    voiture2	vert	3	siege cuir
    voiture2	vert	3	clim
    Ma requete est du type

    select voiture, couleur, option FROM car INNER...... WHERE societe='001'

    Je voudrait savoir si en modifiant ma requete SQL je pourrait arriver à ressortir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    voiture	    couleur1	porte 	         option
    voiture1    rouge        5          clim siege cuir gante autoradio
    voiture2    vert         3           toit ouvrant lecteur cd
    Est-ce possible de réaliser ceci dans une requête?

    Merci d'avance pour votre aide

    guigui69

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Normalement ceci devrait être réalisé du côté applicatif, puisqu'il s'agit de présenter des données, en plus de les retrouver.
    Or la première forme normale (c'est-à-dire la base de toute bonne conception de bases de données) indique que toute valeur doit être atomique.
    Ce n'est pas le cas de ce que vous cherchez

    Comme vous souhaitez faire cela du côté bases de données, et qu'en plus votre conception laisse à désirer, la requête est assez tarabiscotée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ;WITH
    	CTE AS
    	(
    		SELECT	DISTINCT voiture
    			, couleur
    			, porte
    		FROM	@car
    	)
    SELECT		A.voiture
    		, A.couleur
    		, A.porte
    		, LEFT(L.liste_option, LEN(L.liste_option) - 1) AS liste_option
    FROM		CTE AS A
    CROSS APPLY (
    			SELECT		DISTINCT [options] + ', '
    			FROM		car AS T
    			INNER JOIN	CTE AS C
    						ON T.voiture = C.voiture
    						AND A.voiture = T.voiture
    			FOR XML PATH ('')
    		) AS L(liste_option)
    Vous remarquerez que vous avez mis deux fois l'option clim pour la voiture deux.
    Vu la consommation de carburant qu'engendre une seule climatisation sur une voiture, je doute que la plupart des voitures que votre client ou votre entreprise loue en disposent de deux ...
    Ce type de "conception" vous a de plus forcé à répéter autant de fois que d'options le nom, la couleur et les nombre de portes de chaque voiture ...
    Donc en plus de perdre de l'espace, votre BD n'est pas robuste.

    Vous pourriez par exemple avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    CREATE TABLE voiture
    (
    	voiture_id smallint IDENTITY NOT NULL CONSTRAINT PKvoiture PRIMARY KEY
    	, nom varchar(32) NOT NULL
    	, immatriculation varchar(16) NOT NULL CONSTRAINT UQvoiture UNIQUE
    )
    GO
     
    CREATE TABLE voiture_couleur
    (
    	voiture_couleur_id tinyint IDENTITY NOT NULL CONSTRAINT PKvoiture_couleur PRIMARY KEY
    	, nom varchar(32) NOT NULL CONSTRAINT UQvoiture_couleur UNIQUE
    )
    GO
     
    CREATE TABLE voiture_porte
    (
    	voiture_porte_id tinyint IDENTITY NOT NULL CONSTRAINT PKvoiture_porte PRIMARY KEY
    	, nombre tinyint NOT NULL CONSTRAINT CHKvoiture_porte__nombre CHECK (nombre BETWEEN 2 AND 5)
    )
    GO
     
    CREATE TABLE voiture_option
    (
    	voiture_option_id tinyint IDENTITY NOT NULL CONSTRAINT PKvoiture_option PRIMARY KEY
    	, nom varchar(32) NOT NULL CONSTRAINT UQvoiture_option__nom UNIQUE
    )
    GO
     
    CREATE TABLE voiture_caracteristique
    (
    	voiture_caracteristique_id int IDENTITY NOT NULL CONSTRAINT PKvoiture_caracteristique PRIMARY KEY
    	, voiture_id smallint NOT NULL CONSTRAINT FKvoiture_caracteristique__voiture_id FOREIGN KEY (voiture_id) REFERENCES voiture
    	, voiture_couleur_id tinyint NOT NULL CONSTRAINT FKvoiture_caracteristique__voiture_couleur_id FOREIGN KEY (voiture_couleur_id) REFERENCES voiture_couleur
    	, voiture_porte_id tinyint NOT NULL CONSTRAINT FKvoiture_caracteristique__voiture_porte FOREIGN KEY (voiture_porte_id) REFERENCES voiture_porte
    	, voiture_option_id tinyint NOT NULL CONSTRAINT FKvoiture_caracteristique__voiture_option_id FOREIGN KEY (voiture_option_id) REFERENCES voiture_option
    	, commentaire varchar(128)
    	, CONSTRAINT UQvoiture_caracteristique__voiture_id__voiture_couleur_id__voiture_porte_id__voiture_option_id UNIQUE (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id)
    )
    GO
     
    INSERT	voiture (nom, immatriculation) VALUES ('voiture1', 'VOITURE1')
    INSERT	voiture (nom, immatriculation) VALUES ('voiture2', 'VOITURE2')
    GO
     
    INSERT voiture_couleur (nom) VALUES ('rouge')
    INSERT voiture_couleur (nom) VALUES ('vert')
    GO
     
    INSERT	voiture_porte (nombre) VALUES (3)
    INSERT	voiture_porte (nombre) VALUES (5)
    GO
     
    INSERT	voiture_option (nom) VALUES ('clim')
    INSERT	voiture_option (nom) VALUES ('lecteur cd')
    INSERT	voiture_option (nom) VALUES ('toit ouvrant')
    INSERT	voiture_option (nom) VALUES ('gante')
    INSERT	voiture_option (nom) VALUES ('siege cuir')
    GO
     
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 1, 2, 1)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 1, 2, 2)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 1, 2, 3)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 1, 2, 4)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 1, 2, 5)
    GO
     
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 2, 1, 1)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 2, 1, 2)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 2, 1, 3)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 2, 1, 4)
    INSERT	voiture_caracteristique (voiture_id, voiture_couleur_id, voiture_porte_id, voiture_option_id) VALUES (1, 2, 1, 5)
    GO
     
    CREATE VIEW voiture_caracteristique_view
    AS
    	SELECT		V.voiture_id
    			, V.nom AS voiture_nom
    			, VCO.nom AS couleur_nom
    			, VP.nombre AS portes_nombre
    			, VO.nom AS option_nom
    	FROM		dbo.voiture_caracteristique AS VCA
    	INNER JOIN	dbo.voiture AS V
    				ON VCA.voiture_id = V.voiture_id
    	INNER JOIN	dbo.voiture_couleur AS VCO
    				ON VCA.voiture_couleur_id = VCO.voiture_couleur_id
    	INNER JOIN	dbo.voiture_porte AS VP
    				ON VCA.voiture_porte_id = VP.voiture_porte_id
    	INNER JOIN	dbo.voiture_option AS VO
    				ON VCA.voiture_option_id = VO.voiture_option_id
    GO
    Ce que vous avez fait jusque là est dans la vue

    @++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    Merci pour votre réponse je regarde ca,

    j'ai oublié de précisé que nous somme sous ms sql 2000 sp4.

    Je vais regarder ca du coté de notre outil alors.

    Je pensait qu'il y avait un moyen simple à travers une requête d'avoir ceci.

    guigui69

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    La requête que je vous ai donné ne fonctionnera pas sous SQL Server 2000 ...

    Celle-ci oui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT	voiture
    	, couleur1
    	, porte
    	, LEFT(liste_options, LEN(liste_options) - 1) AS liste_options
    FROM	(
    		SELECT	DISTINCT voiture
    			, couleur1
    			, porte
    			, (
    				SELECT	options + ', '
    				FROM	dbo.car AS T2
    				WHERE	T2.voiture = T1.voiture
    				FOR XML PATH ('')
    			) AS liste_options
    		FROM	dbo.car AS T1
    	) AS SUB
    Je ne sais pas pourquoi je ne l'ai pas trouvée ce matin, 'devais pas encore être bien réveillé

    @++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    Merci pour votre aide. Désolé pour la réponse tardive.

    voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    SELECT 
     LTRIM(RTRIM(tgEmpresa.CPostal)+'*'+ tgMarca.Descrip) as Site,           tcVeh.NumPedidoFab as "No_VN",           
     tcVeh.Chasis,   '' as code_marque,		    
      tgMarca.Descrip as Marque,   
     ''  	as CodeVersion,	          
      tgVersion.Descrip  	as Version,	        
        tcVeh.Color as "Code_Teinte",  
    tccolor.descrip as "Teinte",  
    '' as tarif,  
    '' as "date_tarif", 
     '' as "Codes_Options", 
     '' as "Libelles_Options",  
    DATEDIFF(day, tcVeh.FecEntrada, getdate()) as Anciennete,		           
     tcVeh.Tapiz as CodeSellerie,   
     tctapiz.descrip as SellerieInterieure,  
     
    tgcategoria.descrip as genre, 
     tcvehOpcion.Opcion,  
    tcvehOpcion.Descrip      
     
    FROM   			tcVeh    	      
    left outer join tgEmpresa  on  	         tcVeh.Emp = tgEmpresa.Emp    			
    left outer join TgMarca on     	         tcveh.Marca = tgMarca.Marca             left outer join tgModelo on        	      tcveh.Marca = tgModelo.Marca and    	         tcveh.Modelo = tgModelo.Modelo         
     left outer join tgVersion  on           	   tcveh.Marca   = tgVersion.Marca and       	      tcveh.Modelo  = tgVersion.Modelo and    	         tcveh.Version = tgVersion.Version    		
    left outer join tgPtoVenta  on     	      tcVeh.Emp 	= tgPtoVenta.Emp and    	         tcVeh.PuntoVenta = tgPtoVenta.PuntoVenta     			
    left outer join tccolor  on  				tcveh.marca = tccolor.marca and   				tcveh.color = tccolor.color     		
    left outer join tctapiz  on  				tcveh.marca = tctapiz.marca and   				tcveh.tapiz = tctapiz.tapiz             
     left outer join tgVendedor on  	         tcveh.Emp = tgVendedor.Emp and       	      tcveh.reservaVendedor = tgVendedor.Vendedor     			
    left outer join tgcliente on  	         tcveh.reservaCliente = tgCliente.Codigo    			
    left outer join tcvehopcion on  				tcveh.emp = tcvehopcion.emp and   				tcveh.numinterno = tcvehopcion.numinterno     			
    left outer join tcvehsubstatus on  				tcveh.status=tcvehsubstatus.status and   				tcveh.substatus=tcvehsubstatus.substatus    			
    left outer join tcubicacion on  				tcveh.emp 		 = tcubicacion.emp and  				tcveh.ubicacion = tcubicacion.ubicacion    			
    left outer join tgcategoria on  				tcveh.categoria = tgcategoria.categoria    			
    LEFT OUTER JOIN ttCortesiaCategoria ON   				ttCortesiaCategoria.CortesiaCategoria = tcVeh.CortesiaCategoria                  WHERE  		
    tcveh.reservafirme = '0' AND         
      tcveh.EsVO = 0 and   			
    tcveh.status < 30 and  			
    tcveh.status > 0 and  			
    tcveh.substatus not in (11,12,21,22,23) AND  
     (DATEDIFF(day, tcVeh.FecEntrada, getdate())) IS NOT NULL AND  
    esdemo ='0'
    Les deux options que je voudrait mettre sur la meme ligne c'est ces 2 options: tcvehOpcion.Opcion, tcvehOpcion.Descrip

    Je suis sur cette requete depuis 3 heures et je bloque sur le FOR XML PATH.

    Pourriez-vous aiguiller ? Que mettre entre '' dans FOR XML PATH?

    Merci d'avance pour votre aide.

    guigui69

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    829
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 829
    Par défaut
    Je crois que FOR XML PATH ('') n'existe pas sous ms sql server 2000

Discussions similaires

  1. Champs identiques avec valeur différente where dans une même table
    Par Cyrus59 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/11/2014, 16h56
  2. [MySQL] 2 noms de champs identiques dans 2 tables différentes
    Par Shinoda00 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/06/2009, 09h23
  3. [Access] Requête (avec AND) sur 1 meme champ d'une table
    Par jeje22 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/09/2006, 22h59
  4. Sélection de 2 champs identiques dans 2 tables différentes
    Par Véronique75ca dans le forum Access
    Réponses: 3
    Dernier message: 28/06/2006, 09h33
  5. Requete avec filtre sur un champ
    Par podz dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2005, 14h37

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