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

Requêtes et SQL. Discussion :

Inverser un tableau (ou table)


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 22
    Points
    22
    Par défaut Inverser un tableau (ou table)
    Bonjour,

    malgrès mes recherches matinales , je ne trouve pas de sujets correspondant à mes attentes. Le problème doit se poser que je ne dois pas savoir quels termes utilisés surtout pour effectuer les recherches

    mon problème :

    j'ai une requête R qui contient :

    - en entete colonne : des données sur un mois donnée ( D1, D2, D3,...)
    - en entete ligne : les mois traités durant l'année (M1, M2, M3, ...)

    si je crée un état annuel donnant le détail pour chaque mois tel quel, j'obtiendrai un tableau du style :

    | D1 | D2 | D3 | ......
    ------------------------------------------------
    janvier |
    février |
    ....

    mais vu le nombre de données important, il serait plus judicieux de le faire inversé (colonnes => lignes et lignes=>colonnes) comme ceci :

    | janvier | février | mars | ......
    ------------------------------------------------
    D1 |
    D2 |
    ....

    si quelqu'un pouvait soit me donner une solution directe ou au moins m'indiquer où chercher...

    grand merci...

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut,
    en passant par l' <Assistant Requête analyse croisée> il est possible de crée des requêtes avec des lignes à la place de colonnes et colonnes à la place de ligne... je ne vois pas la difficulté, aurais je mal compris?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 22
    Points
    22
    Par défaut oui mais...
    Citation Envoyé par vodiem Voir le message
    salut,
    en passant par l' <Assistant Requête analyse croisée> il est possible de crée des requêtes avec des lignes à la place de colonnes et colonnes à la place de ligne... je ne vois pas la difficulté, aurais je mal compris?
    j'ai bien essayé avec ce système, le problème est que je ne suis pas arrivé à travailler sur plusieurs données à la fois et de plus les entêtes de ligne ou colonnes se nommaient en général des expressions elles mêmes mais ne gardaient pas leur valeur initiale...
    donc je pourrais faire autant de tableau analyse croisée qu'il y a de données mais alors là cà en ferait un peu trops et lourdos comme méthode...

    dommage j'ai pas sous la main ma base...
    j'ai je pense tout essayé et je vois pas comment cela pourrait m'aide à moins que quelqu'un puisse me montrer un bon exemple...

    pour le moment j'ai laissé mes colonnes et mes lignes telles quel ce qui me donne un tableau final en long et non en hauteur comme mon boss aimerait...

    je suis toujours preneur de bonnes idées tout de même...

    PS: je vous ai peut etre induit en erreur sur une chose :
    mes lignes actuellement représentent les mois donc bien M1 M2 M3 .. M12
    par contre mes colonnes représentent des données qui n'ont rien avoir avec une incrémentation comme je pouvais laisser suppposer ...
    disons que ce serait du style: Quantités CA Loyer Essence.... des données n'ayant pas de point commun...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    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
    Sub anadecroise(source As String, cible As String, nbfix As Integer)
    'cette procèdure crée une table cible
    'à partir de la table source
    ' elle fait le travail inverse d'une requête analyse croisée
    'les  premières colonnes spécifiées par nbfix restent inchangées
    'la colonne (ipivot) suivante reprendra les intitulés des
    ' colonnes supérieures à nbfix
    'la colonne suivante (dpivot) contient les valeurs transposées
    Dim base As DAO.Database
    Dim champ As DAO.Field
    Dim depart As DAO.Recordset
    Dim departdef As DAO.Fields
    Dim boucle As Integer
    Dim typechamp As Integer
    Dim incohérent As Boolean
    Dim sql As String
    Dim sqlb As String
    If source = cible Then Exit Sub
    Set base = CurrentDb()
    'ici la procédure s'arrête si la table source n'existe pas
    Set depart = base.OpenRecordset(source)
    Set departdef = base.TableDefs(source).Fields
    'vérification du nombre de champ à transposer
    If nbfix + 2 > departdef.Count Then
    MsgBox "il doit y avoir au moins deux champs à transposer", vbCritical, "ERREUR"
    Exit Sub
    End If
    'vérification du type des champs de source
    typechamp = departdef(nbfix).Type
    incohérent = False
    For boucle = nbfix + 1 To departdef.Count - 1
    Set champ = departdef(boucle)
    If champ.Type <> typechamp Then incohérent = True
    Next boucle
    If incohérent Then
    MsgBox "tous les champs transposés doivent avoir le même type", vbCritical, "ERREUR"
    Exit Sub
    End If
    'création de la table cible et ajout de la première colonne à transposer
    sql = "SELECT "
    For boucle = 0 To nbfix - 1
    sql = sql & departdef(boucle).Name & ","
    Next boucle
    sql = sql & "'" & departdef(nbfix).Name & "' as ipivot"
    sql = sql & ", " & departdef(nbfix).Name & " as dpivot into " & cible & " from " & source & ";"
    DoCmd.RunSQL (sql)
    sql = "INSERT INTO " & cible & "("
    For boucle = 0 To nbfix - 1
    sql = sql & departdef(boucle).Name & ","
    Next boucle
    sql = sql & "ipivot,dpivot ) select "
    For boucle = 0 To nbfix - 1
    sql = sql & departdef(boucle).Name & ","
    Next boucle
    DoCmd.SetWarnings False
    'ajout des données suivantes
    For boucle = nbfix + 1 To departdef.Count - 1
    sqlb = sql & "'" & departdef(boucle).Name & "' as ipivot," & departdef(boucle).Name & " as dpivot from " & source & ";"
    DoCmd.RunSQL (sqlb)
    Next boucle
    DoCmd.SetWarnings True
    End Sub
    Elle est pas belle la vie ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 22
    Points
    22
    Par défaut grand merci...
    merci beaucoup de t'être penché sur mon souci...

    malheureusement je vais devoir attendre lundi prochain pour essayer ton code mais promis j'en dirai des nouvelles !

    à moins que je 'plante' sur quelque chose pour le faire fonctionner mais dans ce cas je te demanderai plus amples explications...

    merci encore une fois...

    déjà une question : pour lancer le code je passe le lancement par une macro ?

  6. #6
    Candidat au Club
    Homme Profil pro
    responsable projet
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : responsable projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut le programme bug....
    Cet echange a eu lieu il y a longtemps et je suis arrivé dessus pour rechercher effectivement une solution pour passer d'un tableau à une liste. J'ai essayé ce programme toutefois il bug sans message au premier DoCmd.RunSQL (sql).

    J'ai mis un debug:print pour être sûr de bien comprendre la chaine de caracteres sql qui était fabriqué. J'ai même remplacé cette chaine en litterale dans le programme

    DoCmd.RunSQL ("SELECT champ0_source,'nom_champ1_source' as ipivot, nom_champ1_source as dpivot into Table_cible from Table_source;")

    Meme resultat...



    J'ai pensé que comme il n'y a pas de creation de la table cible, cela pouvait être le problème. J'ai donc cree une table cible avec le premier champ nommé du meme nom que le premier champ de la table source, le deuxieme champ nommé ipivot et le 3ieme dpivot.

    Meme resultat...


    ou alors ipivot et dpivot sont des mots clefs mais je ne trouve pas dans la litterature (internet) beaucoup d'information dessus.

    J'ai bien activé Microsoft DAO 3.6 Object Library dans ACESS 2007, il y a peut etre autre chose à activer

    J'ai lu aussi qu'on avait la fonction UNPIVOT... pour ca

    Bref, je suis sec! et pas tres experimenté en particulier en SQL et ce sous-programme de traduire un tableau en enregistrement est vraiment important car il va être utilisé pour bon nombre de tableaux à entrer dans la base de données pour pouvoir traiter efficacement ces données cycliquement.

    Merci si vous avez une solution à me proposer.

    Oliv0

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Il faut déjà voir au niveau de la structure des tables. Il n'y a pas de solution universelle.

  8. #8
    Candidat au Club
    Homme Profil pro
    responsable projet
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : responsable projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut j'ai reussi
    En fait, j'ai remarqué que pour les requetes interpretées en mode SQL, les champs et les tables étaient entre crochets [.....]. ce qui n'est pas le cas dans le programmes plus haut. Pourquoi dans mon access 2007 et même la version antérieure c'est comme ça et que ca ne l'ai pas ici, je n'en sais rien. d'ailleurs j'aimerais bien savoir.

    J'ai donc modifié l'élaboration des chaine de caracteres dans ce sens pour obtenir:

    DoCmd.RunSQL ("[SELECT champ0_source],'nom_champ1_source' as [ipivot], [nom_champ1_source) as [dpivot] into [Table_cible] from [Table_source];")

    Et j'obtiens exactement ce que je voulais obtenir... C'est FOR-MI-DA-BLEEEUUUU!
    Oliv0

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/08/2007, 09h47
  2. [Débutant] Inverser un tableau
    Par Zhitoune dans le forum Delphi
    Réponses: 9
    Dernier message: 22/06/2007, 10h56
  3. Algorythmie: inverser un tableau c++
    Par corseb-delete dans le forum C++
    Réponses: 12
    Dernier message: 12/12/2006, 02h28
  4. Inversion de tableau
    Par Florian.L dans le forum Ada
    Réponses: 1
    Dernier message: 21/11/2006, 10h03
  5. Inversion symétrique d'une table
    Par Jean.nantes dans le forum Access
    Réponses: 3
    Dernier message: 27/10/2006, 21h52

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