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 :

tsql : ajout des colonnes dynamiques


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 41
    Points
    41
    Par défaut tsql : ajout des colonnes dynamiques
    Bonjour,

    Je veux ejouter des colonnes dinamiquement aux resultats de ma requette , ex :

    je veus avoir la matiere , note dans la matière pour chaque etudiant pour une classe donnée, le couple matière/note doit se repeter autant de fois que la classé passé des examen ,l'id de la classe est passé en parmétre

    ex : pour la classe c1
    ----------------------------------------------------------------------------------
    Etudiant | Matière | Note | Matiere | Note | Matiere | Note |
    ----------------------------------------------------------------------------------
    | | | | | | |

    pour la classe c2
    -------------------------------------
    Etudiant | Note | Matière |
    -------------------------------------
    | | |

    Merci beaucoup pour l'aide !

  2. #2
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Ce que vous cherchez à faire semble être d'ordre cosmétique. Dans ce cas, le SGBD n'est pas fait pour cela, c'est à l'application cliente de s'en charger.
    De plus il ne suffit pas de "balancer" une demande sur le forum pour la voir soudain satisfaite, commencez par écrire votre requête, on vous aidera certainement par la suite.
    Enfin, lisez les règles du forum.

    Merci
    Christophe B.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    La requette servira pour une extraction Excel (Pas d'application Client ) .

    J'ai commencé deja ma requette , mon idée et concaténer une longue chaine @marequette , et de l'exécuter à la fin .

    Je concatène les colonnes à l'aide d'une boucle while .

    Dans @marequette j'ajoute toutes les instruction de la création et le remplissage des données depuis 'create table matable' ,'update set' jusqu'au 'select * from matable ' pour l'affichage .

    L'idée semble bien , et ca marche pour un nombre limité d'enregistrements ,sauf que la taille maximale d'une chaine et de 8000 , Or c'est normale que la chaine demande beaucoup plus .

    Merci pour l'aide .

  4. #4
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Lorsque vous parlez d'extraction Excel, cela signifie que vous souhaitez que les données se retrouvent dans excel pour être retraitées, je suppose. Dans ce cas Excel vous propose le Tableau Croisé Dynamique. Simplement à partir de vos données créez une requête qui va les extraire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    | CLASSE | ETUDIANT | MATIERE | NOTE |
    Puis créez un tableau croisé dynamique. Dans la Disposition du tableau mettez le champ Classe en zone Page, le champ Etudiant en zone Ligne, le champ Matière en zonr Colonne et le champ Note en zone Données (en demandant de calculer la moyenne).

    Vous devriez avoir votre bonheur.

    Cordialement
    Christophe B.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 41
    Points
    41
    Par défaut
    rebonjour

    Je n'ai pas la possibilité de configurer Excel pour tous les tulisateur de la requette .

    j'ai trouvé une solution J'ai procédé comme suite :

    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
     
    -- recuperation de max des évaluation (couple matiere/note )
     
    declare @max_e bigint
    declare @id_etudiant bigint
     
     
    declare @i bigint
    declare @matiere varchar(500)
    declare @note varchar(500)
    declare @nbr_evaluation bigint -- nombre d'evaluation de l'etudiant courant
     
     
    select count(distinct(id_evaluation)) nbr_e into #temp
    FROM mes_tables
    group by etu.id_etudiant
    set @max_ea=(select distinct max(nbr_e) from #temp)
    drop table #temp
    création de l'entê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
     
     
     
    -------------------- creation de l'entête statique
     
    set @requette='create table RETOUR (id_etudiant bigint,NOM varchar(500),Prenom varchar(500)'
     
    -------------------- Ajout de l'entête dynamique
     
     
    set @i=1
    while (@i < @max_e+1)
    begin
    set @requette=@requette + ',matiere' + convert(varchar,@i) + ' varchar(500),note' + convert(varchar,@i) + ' varchar(500)
    set @i=@i+1
    end
    set @requette=@requette +')'
    exec(@requette)


    insertion des valeurs statiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
     
    -------------------- insertion des enregistrement statiques
     
    set @requette= +' Insert into RETOUR(id_etudiant,NOM,prenom)
    select  distinct
    etu.id_etudiant as id_etudiant
    ,u.NOM as nom
    ,u.prenom as prenom
    from mes_tables'
    exec(@requette)
    insertion des données dynamiques par 2 curseur , le 1er sur les étudiant et le 2eme sur le nombre d'évaluation pour chaque étudiant

    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
     
     
    -------------------- insertion des enregistrement dinamique
     
    --- 1er cureseur des etudiant
     
    DECLARE id_cursor CURSOR FOR
    select distinct etu.id_etudiant ,count(id_e) 
    FROM mes_tables
    group by etu.id_etudiant
     
    	OPEN id_cursor
    		FETCH NEXT FROM id_cursor INTO @id_etudiant,@nbr_evaluation	
    	WHILE @@FETCH_STATUS = 0
    	BEGIN
    set @i=1
     
     
    set @requette1='update RETOUR set '	
    --- 2eme cureseur des evalutaion
     
    				DECLARE e_cursor CURSOR FOR
    				select distinct e.id_evalutaion,evalutaion.matierer,evalutaion.Note
    				mes_tables
    				where etu.id_etudiant=@id_etudiant
     
    				OPEN e_cursor
     
    				FETCH NEXT FROM ea_cursor INTO @id_evaluation,@matiere,@note		
    				WHILE @@FETCH_STATUS = 0
    				BEGIN
     
    --Update des données Dynamique	
     
     
     
     
    set @requette1=@requette1+'matiere'+convert(varchar,@i)+' = ' + isnull(dbo.quotestring(@entreprise),'''''''''')+',note'+convert(varchar,@i)+' = '+isnull(dbo.quotestring(@service),'''''''''')',' 
     
    set @i=@i+1					
     
     
    				FETCH NEXT FROM ea_cursor INTO @id_evaluation,@matiere,@note		
    				end
    				CLOSE ea_cursor
    				DEALLOCATE e_cursor
     
     
    set @requette1=SUBSTRING(@requette1,1,LEN(@requette1)-1) + ' where id_etudiant = ' + convert(varchar,@id_etudiant)
    exec(@requette1)
     
    FETCH NEXT FROM id_cursor INTO @id_etudiant,@nbr_ea 		
    	END	
    	CLOSE id_cursor
    	DEALLOCATE id_cursor
    affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    -------------------- Affichage
    set @requette= 'select * from RETOUR '
     
    exec(@requette)
    drop table RETOUR
    -J'ai exécuté la raquette à plusieurs reprise pour éviter la limite de 8000 car .
    -j'ai simplifier le code pour qu'il soit plus lisible .
    -dbo.quotestring() est ma fonction pour regler le problème d'apostrophe dans la chaine de caractère à exécuter .

    Merci pour les réponses .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DataTable avec des colonnes dynamiques
    Par PrinceDeLu dans le forum JSF
    Réponses: 5
    Dernier message: 15/04/2011, 10h54
  2. Réponses: 1
    Dernier message: 14/08/2006, 09h41
  3. Jtable ajouter des colonne
    Par toure32 dans le forum Composants
    Réponses: 6
    Dernier message: 21/06/2006, 09h15
  4. [SQLServer] ajout de colonne dynamique
    Par pi05 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/05/2006, 11h14
  5. Réponses: 4
    Dernier message: 17/05/2006, 09h21

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