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

Langage SQL Discussion :

Comment convertir les champs d'une table en enregistrements


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 188
    Points : 66
    Points
    66
    Par défaut Comment convertir les champs d'une table en enregistrements
    Bonjour
    j'ai plusieurs tables de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    c101  	c102	        c103	          date 
    10		16		18		10/10/2014
    11		19		23		23/10/2014
    que je voudrais convertir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Compte	valeur 	date
    c101	        10		10/10/2014
    c101	        11		23/10/2014		
    c102	        16		10/10/2014
    c102	        19		23/10/2014
    c103	        18		10/10/2014
    c103	        23		23/10/2014
    j'ai une solution qui consiste en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select 'c101' as compte , c101 as valeur , date from table1
    union 
    select 'c102' as compte , c102 as valeur , date from table1
    union
    select 'c103' as compte , c103 as valeur , date from table1
    Je voudrais une requête qui sera plus automatique surtout que ma table contient plus de 10 champs et j'ai plusieurs tables à traiter.
    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 896
    Points : 53 130
    Points
    53 130
    Billets dans le blog
    6
    Par défaut
    Il était parfaitement stupide de modéliser votre table ainsi. C'est un viol par extension de la première forme normale. Si vous ne modélisez pas correctement votre base, non seulement vous aurez des performances de merde mais aussi de grande difficulté à écrire vos requêtes !
    Il n'existe pas de "silvère boulette" pour répondre à votre cas de figure... La seule solution est ce que vous avez fait !
    Mieux vaut donc reprendre votre modèle....

    A +

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 188
    Points : 66
    Points
    66
    Par défaut
    Bonjour je te remercie pour votre remarque très intéressante mais par malheur j'ai la lourde tâche d'intervenir sur un système (en production ) pourri est plein d'erreurs de modélisation.
    Alors votre suggestion de modifier le modèle est impossible .
    Veuillez m'aider encore.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Si votre SGBDR (quel est-il ?) le supporte, vous pouvez utiliser UNPIVOT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT compte, valeur, dte
    FROM table1 UNPIVOT (
    	valeur FOR compte IN (c101, c102, c103)
    	) u
    Sinon :
    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
     
    SELECT 
    	CASE T.nb 
    		WHEN 1 THEN 'c101'
    		WHEN 2 THEN 'c102'
    		WHEN 3 THEN 'c103'
    	END AS compte
    	,CASE T.nb
    		WHEN 1 THEN c101
    		WHEN 2 THEN c102
    		WHEN 3 THEN c103
    	END AS Valeur
    	,DTE
    FROM table1
    CROSS JOIN (
    	SELECT 1 as nb
    	union all select 2
    	union all select 3
    ) T

  5. #5
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Sous quel SGBD travailles tu?

  6. #6
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 188
    Points : 66
    Points
    66
    Par défaut
    ingres10.
    merci je vais tester les requêtes et je vous informe des résultats
    merci

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 188
    Points : 66
    Points
    66
    Par défaut
    Merci aieuuuuu pour ta réponse .
    Sauf que dans ma table initiale (table1) les champs c'est les (c101,c102,c103,date) alors je n'ai pas de champ compte ou valeur. Ces deux derniers, je dois les créer (générés par la requête).

    Pour la deuxième solution, elle marche très bien sauf que j'ai besoin de m'expliquer son fonctionnement, car j'ai d'autres champs à ajouter et je voudrais l'appliquer à d'autres tables de la même forme que table1.
    Merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/08/2011, 08h03
  2. Réponses: 1
    Dernier message: 09/10/2008, 19h04
  3. Réponses: 4
    Dernier message: 21/06/2007, 13h33
  4. [MySQL] Comment afficher tous les champs d'une table?
    Par Nibor dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/11/2006, 20h20
  5. Réponses: 4
    Dernier message: 08/07/2006, 06h36

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