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

Développement SQL Server Discussion :

requete transformation Lignes en colonnes


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut requete transformation Lignes en colonnes
    Bonjour tout le monde,
    J'ai une table matable qui contient une seule colonne
    select * from matable

    colonne0
    A1
    B1
    C1
    D1
    A2
    B2
    C2
    D2
    ...

    J'aimerais écrire une requête qui me permet d'afficher de cette maniéré :
    colonne 0 colonne1 colonne2 colonne3
    A1 B1 C1 D1
    A2 B2 C2 D2
    A3 B3 C3 D3

    Pivot ne m'as pas vraiment aidé sur ce coup la !!
    Des proposition?

  2. #2
    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

    Est-ce que ce sont vos vraies données ? pourquoi voulez vous faire ça ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Oui j'ai une table que j'ai importé d'un fichier texte qui contient
    nom1
    prenom1
    adresse1
    tel1
    nom2
    prenom2
    adresse2
    tel2
    ....

    Je veux avoir cette structure
    nom1 prenom1 adresse1 tel1
    nom2 prenom2 adresse2 tel2
    ...
    Afin de pouvoir manipuler mes données d'une maniéré classique .

  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
    le rang est inclus dans la donnée ???? vous voulez dire que par exemple, vous avez pour le contact #3 un numéro de téléphone comme ça :
    01-02-03-04-053 ?

    ou bien est-ce que vous comptez sur l'ordre des lignes

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    De préférence je compte sur le numéro de téléphone qui est de la forme suivante 01 02 03
    Parce que je ne suis pas sur que c'est assez régulier comme donnée
    Donc à chaque fois qu'il trouve un format de date il le met avec les deux lignes qu'ils le précèdent.

  6. #6
    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
    donc vous comptez sur l'ordre des lignes...

    Cela tombe mal, car les lignes n'ont pas d'ordre dans une base de données.

    Vous pouvez tenter quelques bricolages, mais vous n'aurez pas de solution fiable à votre problème en l'état.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Je vais supprimer quelques lignes pour m'assurer que le résultat sera fiable avec le nombre de ligne
    Une proposition sur comment j'affiche le top(4) de ma requête dans une ligne et refaire ce travail jusqu'à la fin de ma table ?

  8. #8
    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,

    vous pouvez essayer cette requête, qui compte sur le fait que l'ordre physique des lignes sera conservé, ce qui n'est pas garanti.

    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 tmp AS (
    	SELECT
    		Colonne0 as txt
    		,row_number() over(order by (SELECT NULL)) as rn
     
    	from matable
    )
    SELECT 
    	Nom.txt AS Nom,
    	Prenom.txt AS Prenom,
    	Adress.txt AS Adresse,
    	Tel.txt AS Telephone
    FROM		tmp Nom
    inner join	tmp Prenom
    	on			prenom.rn = nom.rn + 1
    inner join	tmp Adress
    	on			Adress.rn = nom.rn + 2
    inner join	tmp Tel
    	on			Tel.rn = nom.rn + 3
    WHERE	Nom.rn%4 = 1
    Par ailleurs, s'il vous manque ne serait-ce qu'une ligne, tout sera décalé.

    en conclusion :
    - A ne pas mettre en prod
    - vérifiez bien les résultats

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Elle est fantastique cette requête , à priori elle fonctionne bien je vais quand même vérifier s'il y a des erreur
    Mais sinon Pouvez-vous m'expliquer le code parce que ça me dépasse la
    Merci encore

  10. #10
    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
    row_number() over(ORDER BY (SELECT NULL)) AS rn sert a attribuer un numéro à chaque ligne. Comme on n'a rien pour spécifier l'ordre, j'ai mis SELECT NULL, donc l'ordre est aléatoire, et comme je disais, on compte sur le fait que les lignes seront numérotées selon leur ordre de physique... mais il pourrait en être autrement.

    Ensuite, on prend toutes les lignes dont le nombre modulo 4 est à 1 (donc toutes les 4 lignes, ce qui doit correspondre au nom). Enfin, on prend le numero + 1 pour le prénom, le numéro + 2 pour l'adresse...

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Chaque jour j'apprend des trucs sur sql
    Mon problème maintenant c'est que le nombre de lignes n'est pas toujours régulier et j'ai du mal à supprimer des lignes par peur de changer l'ordre c'est à dire parfois il n'y a pas de numéro de téléphone donc les lignes qui vont suivre sont fausses. Et je n'est aucun moyen de distinguer les champs à part l'adresse qui doit contenir la chaîne '%L-()%' et les numéro de téléphone des valeurs numérique.
    C'est faisable tout ça avec sql ?

  12. #12
    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
    tout est faisable en SQL... la question est : "en combien de temps" !

    reprenez votre fichier d'origine, faite un programme qui va le parser ligne par ligne, ou nettoyez vos données à la source si vous le pouvez. Car là vous n'avez pas finis, et à mon avis, vous irez plus vite à la main !

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    A la base j'ai récupéré mon fichier d'un annuaire
    Je vais chercher comment importer les données d'une autre maniéré
    Je viens vers vous pour vous parler de mon état d'avancement.
    Merci pour tout

Discussions similaires

  1. [AC-2007] requetes - transformer lignes en colonnes
    Par nesswaffle dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 16/07/2014, 09h14
  2. [MySQL] transformer ligne en colonne dans tableau après regroupement
    Par yadou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/07/2007, 15h27
  3. Transformer ligne en colonne
    Par delphine_lep dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/10/2006, 14h15
  4. transformation lignes en colonne
    Par marti dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/06/2006, 17h13
  5. Requête : Transformer lignes en colonnes
    Par bleu_ciel dans le forum Access
    Réponses: 6
    Dernier message: 27/05/2006, 21h26

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