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 :

Utilisation du pivot dans une requete sql


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Utilisation du pivot dans une requete sql
    Bonjour,
    je suis super novice en sql. Je créer un petit logiciel pour gérer le suivi de formation de sapeurs pompier de mon centre de secours. Ma base de donnée que j'alimente est de forme :
    Nom Stage fin recu
    Nom1 Stage 1 Date1 O
    Nom2 Stage 1 Date2 O
    Nom3 Stage 2 Date3 N


    Je cherche a créer une mise en forme plus synthétique pour visualiser les stages acquits dans la forme suivante :

    Nom stage1 stage2 ... stage50
    Nom1 Date Date Date
    Nom2 Date Date Date
    Nom3 Date Date Date
    ...
    Nom30 Date Date Date

    Pour l'instant voici ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Nom, [PSE1], [PSE2], [SAP1] FROM (SELECT NOM, FORMATION from [HISTO] where RECU='O') pvt  PIVOT (MAX(Fin) FOR FORMATION IN ([PSE1][PSE2][SAP1])) as pvt
    Sachant que FORM est le nom de ma table, [PSE1], [PSE2], [SAP1] sont des exemples de stages dans le champ FORMATION.

    Le pb que me remonte visual basic lors du debogage est : Erreur de syntaxe dans la clause FROM.

    Merci beaucoup de votre aide.

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Bonjour Kaelinou,

    Je vois plusieurs points qui posent problème dans ta requête:



    • Tu donnes le même alias 'pvt' à la table dérivée et à la table retournée par l'opérateur PIVOT. Cela ne facilite pas la compréhension du code.


    • Majuscule, minuscule, choisit ton camp. Ton code gagnera en lisibilité.


    Sachant que FORM est le nom de ma table
    Je dois être très fatigué, je ne vois pas de table portant ce nom dans ton code

    En gros, je pense que ton code devrait ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    	Nom, [PSE1], [PSE2], [SAP1]
    FROM (
    	SELECT 
    		Nom, Formation, Fin
    	FROM Schema.HISTO
    	WHERE Recu = 'O'
    ) AS dt
    	PIVOT (MAX(Fin) FOR Formation IN ([PSE1], [PSE2], [SAP1])) AS pvt
    Tu peux aussi utiliser l'expression CASE (standad SQL):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
    	Nom,
    	MAX(CASE WHEN Formation = 'PSE1' THEN Fin END) AS [PSE1],
    	MAX(CASE WHEN Formation = 'PSE2' THEN Fin END) AS [PSE2],
    	MAX(CASE WHEN Formation = 'SAP1' THEN Fin END) AS [SAP1]
    FROM Schema.HISTO
    WHERE Recu = 'O'
    GROUP BY Nom
    Pour être plus précis, il nous faudrait la structure de la table concernée.

  3. #3
    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 vous avez demain un nouveau stage, vous devrez modifier votre requête !
    Comme cela reste de la présentation, il serait plus judicieux de laisser VB s'occuper du pivot, (éventuellement de façon dynamique pour gérer un nouveau stage...)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci de vos réponses.

    Si je peux ne pas figer les stages et les organiser de facon dynamique, je suis preneur.

    Concernant les requêtes de Niklosus, j'ai essayé sans grand succès. Je suis une vraie quiche...
    Ma table [HISTO] a 6 champs : NOM,FORMATION,DEBUT,FIN,ACCEPTE,RECU j'espère êtr suffisement precis pour toi.

    EN gros je souhaite avoir en entete de chaque ligne les 'NOM' et n entte de chaque colonne les 'FORMATION' et si le champs 'RECU' = 'O' mettre la date de 'FIN' corespondante.

    Cela parait plus clair? Merci de votre aide.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    En effet, l'opérateur PIVOT ne vous permet pas de gérer les nouveaux stages sans passer par du SQL dynamique.

    Quel est le problème avec les requêtes du précèdent message ? Elles retournent un message d'erreur ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Salut,

    J'ai essayé les 2 solutions :

    Avec la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Nom, [PSE1], [PSE2], [SAP1] FROM (SELECT Nom, Formation, Fin FROM Schema.HISTO WHERE Recu = 'O') AS dt PIVOT (MAX(Fin) FOR Formation IN ([PSE1], [PSE2], [SAP1])) AS pvt
    c'est encore le message "Erreur de syntaxe dans la clause FROM." qui est en cause.


    Avec la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Nom, MAX(CASE WHEN Formation = 'PSE1' THEN Fin END) AS [PSE1],	MAX(CASE WHEN Formation = 'PSE2' THEN Fin END) AS [PSE2], MAX(CASE WHEN Formation = 'SAP1' THEN Fin END) AS [SAP1] FROM HISTO WHERE Recu = 'O' GROUP BY Nom
    c'est "Échec de IErrorInfo.GetDescription avec E_FAIL(0x80004005)."

    Cela vient de ma manière d'écrire la requête? sous VB la requête est plus facile a mettre sur 1 seule ligne pour moi.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Avez-vous essayé ces requêtes sous SSMS ?

    Dans la première requête, attention au nom du schéma devant la table HISTO. Si vous n'avez pas précisé de schéma lors de la création de la table, alors replacez par 'dbo.HISTO' (dbo est le schéma par défaut pour toute nouvelle DB).

    Je vous conseille dans un premier temps, de tester ces requêtes sous SSMS (SQL Server Management Studio).


    Comme cela reste de la présentation, il serait plus judicieux de laisser VB s'occuper du pivot
    Mais vous devriez suivre le conseil de aieeeuuuuu en laissant VB pivoter les données.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Je vais paraitre bete mais je pose quand meme la question : comment laisser vb pivoter les données?
    Je lui donne juste la requete de base du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM,FORMATION,FIN FROM [HISTO] WHERE RECU='O'
    Puis je lui demande de mettre en forme?

  9. #9
    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
    C'est ça !

    Vous récupérez les données telle quelle, puis vous mettez en forme en VB, par exemple en bouclant sur le résultat et en répartissant les données dans un tableau... ou toute autre méthode de votre choix.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    bon,j'ai écouté vos conseils et je passe par une mise en forme de mon tableau avec une boucle. Cela marche très bien. Merci a vous pour avoir avoir pris du temps pour m'aider.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 18/11/2008, 14h00
  2. Utiliser la valeur d’un textbox dans une requete sql
    Par Developpeur19 dans le forum VB.NET
    Réponses: 8
    Dernier message: 14/11/2008, 09h10
  3. Utilisation de variable Builder dans une requete SQL
    Par _ben_ dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/06/2007, 11h36
  4. utilisation d'une variable dans une requete SQL
    Par ezneti dans le forum Visual C++
    Réponses: 1
    Dernier message: 30/04/2007, 09h47
  5. utilisation du contenu d'un champ edit dans une requete sql
    Par amri2006 dans le forum C++Builder
    Réponses: 2
    Dernier message: 23/01/2006, 16h05

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