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 :

Script SQL


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Script SQL
    Bonjour à vous tous et merci pour vos retours.

    Je rencontre quelques difficultés dans la matérialisation d'un script en SQL server.
    Veuillez avant tout m'excuser mon coté néophyte dans se domaine. Mais je vais essayer de vous expliquer

    Champ : co_orga (charvar 255)
    Je dois travailler à partir de ces chaines de caractères

    co_orga
    DGS / DGA_C / DEJS (Direction Education Jeunesse et Sports)
    DGS / DGA_C / DEJS / Education / Collège
    DGS / DF (Direction des Finances)
    DGS / DGA_T / DID / DAAT / SR Plaine-Littoral
    DGS / DGA_T / DEE / SN (Service Sites Naturels)

    1/ Je dois créer un champ "libelle" qui doit "littéralement" transformer la chaine de caractère dans co_org comme suit :

    SI co_orga contient des "(" ")" ALORS PRENDS de texte entre parenthèses (sans espaces début et fin)
    SINON Sélectionne le dernier "/" à Gauche de cette chaine et affiche se qu'il y à droite de celui ci

    Le résultat devrait être le suivant dans le champs libellé :

    libelle
    Direction Education Jeunesse et Sports
    Collège
    Direction des Finances
    SR Plaine-Littoral
    Service Sites Naturels

    2/ Je dois créer un champ "Id_court" qui doit "littéralement" transformer la chaine de caractère dans co_org comme suit :

    SI co_orga contient des "(" ")" ALORS affiche le texte sans les parenthèses (et sans espaces)
    SINON Affiche la chaine de caractère

    Le résultat devrait être le suivant dans le champs libellé :

    id_court
    DGS / DGA_C / DEJS
    DGS / DGA_C / DEJS / Education / Collège
    DGS / DF
    DGS / DGA_T / DID / DAAT / SR Plaine-Littoral
    DGS / DGA_T / DEE / SN

    3/ Je dois créer un champ "Id_parent" qui doit "littéralement" transformer la chaine de caractère dans "id_court" comme suit :

    Prends le texte à gauche du dernier "/" de la chaine

    Le résultat devrait être le suivant dans le champs id_parent :

    id_parent
    DGS / DGA_C
    DGS / DGA_C / DEJS / Education
    DGS
    DGS / DGA_T / DID / DAAT
    DGS / DGA_T / DEE

    J'espère avoir été assez explicite pour que vous puissiez m'aider

    Bien à vous

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il faut jouer avec les fonctions de manipulation de chaînes, mais rien de trop difficile ici :
    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
    declare @mytable table (co_orga varchar(100));
     
    insert into @mytable (co_orga) values
    ('DGS / DGA_C / DEJS (Direction Education Jeunesse et Sports)'),
    ('DGS / DGA_C / DEJS / Education / Collège'),
    ('DGS / DF (Direction des Finances)'),
    ('DGS / DGA_T / DID / DAAT / SR Plaine-Littoral'),
    ('DGS / DGA_T / DEE / SN (Service Sites Naturels)');
     
    select co_orga
         , case
             when charindex('(', co_orga) > 0 and charindex(')', co_orga) > charindex('(', co_orga)
             then substring(co_orga, charindex('(', co_orga) + 1, charindex(')', co_orga) - charindex('(', co_orga) - 1)
             else substring(co_orga, len(co_orga) - charindex('/', reverse(co_orga)) + 3, len(co_orga))
           end as libelle
         , case
             when charindex('(', co_orga) > 0 and charindex(')', co_orga) > charindex('(', co_orga)
             then substring(co_orga, 1, charindex('(', co_orga) - 2)
             else co_orga
           end as id_court
         , substring(co_orga, 1, len(co_orga) - charindex('/', reverse(co_orga)) - 1) as id_parent
      from @mytable;
     
    co_orga                                                      libelle                                 id_court                                       id_parent
    -----------------------------------------------------------  --------------------------------------  ---------------------------------------------  ------------------------------
    DGS / DGA_C / DEJS (Direction Education Jeunesse et Sports)  Direction Education Jeunesse et Sports  DGS / DGA_C / DEJS                             DGS / DGA_C
    DGS / DGA_C / DEJS / Education / Collège                     Collège                                 DGS / DGA_C / DEJS / Education / Collège       DGS / DGA_C / DEJS / Education
    DGS / DF (Direction des Finances)                            Direction des Finances                  DGS / DF                                       DGS
    DGS / DGA_T / DID / DAAT / SR Plaine-Littoral                SR Plaine-Littoral                      DGS / DGA_T / DID / DAAT / SR Plaine-Littoral  DGS / DGA_T / DID / DAAT
    DGS / DGA_T / DEE / SN (Service Sites Naturels)              Service Sites Naturels                  DGS / DGA_T / DEE / SN                         DGS / DGA_T / DEE

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse waldar, j'ai testé le code et il fonctionne très bien encore merci.

    J'aurais juste une modification à faire sur l’exception DGS (Direction Générale des Services) qui devrait donner DGS seul dans id_parent cf PJ

    Encore merci pour le temps accordé à cette requête

    Cordialement
    Images attachées Images attachées  

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Champs libelle ajout d'une condition supplémentaire
    Merci pour cette réponse waldar, j'ai testé le code et il fonctionne très bien encore merci.

    J'aurais juste une modification à faire sur la colonne libelle de la manière suivante (additionnelle aux autres conditions)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    , case
             when charindex('(', co_orga) > 0 and charindex(')', co_orga) > charindex('(', co_orga)
             then substring(co_orga, charindex('(', co_orga) + 1, charindex(')', co_orga) - charindex('(', co_orga) - 1)
             else substring(co_orga, len(co_orga) - charindex('/', reverse(co_orga)) + 3, len(co_orga))
           end as libelle
    Il faudrait que si co_orga ne contient ni () ni / que la colonne libelle contienne la valeur de co_orga

    Pourriez vous m'aider dans cette démarche

    Vous en remerciant d'avance

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ben là, forcez-vous un peu, vous avez déjà 90 % de fait et toutes les informations pour terminer.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour, je ne suis vraiment pas du tout informaticien c'est le premier langage que je rencontre , je triture les formules dans tout les sens depuis hier.

    J'ai regarder chaque fonction sur le net pour voir se qu'elle font, j'étudie la logique de chaque ,CASE de ma problématique. Mais à chaque fois cela me retour pas se que je veux.

    SVP aidez moi, mais surtout expliquer moi, je ne demande qu'à apprendre et suis de vraiment motiver, mais pour le moment ma formation en sql n'est pas arrivée à se niveau.

    merci

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je détaille pour le libellé, mais je vous laisse transposer aux autres colonnes et essayer de trouver la solution par vous-même (très gratifiant !).

    J'ai utilisé cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case
      when charindex('(', co_orga) > 0 and charindex(')', co_orga) > charindex('(', co_orga)
      then substring(co_orga, charindex('(', co_orga) + 1, charindex(')', co_orga) - charindex('(', co_orga) - 1)
      else substring(co_orga, len(co_orga) - charindex('/', reverse(co_orga)) + 3, len(co_orga))
    end as libelle
    Commençons par le CASE, c'est très simple c'est un simple "SI, ALORS, SINON". Si telle condition est remplie alors fait ceci, sinon fait cela.
    Je simplifie mon case en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE
      WHEN condition
      THEN condition_vraie
      ELSE condition_fausse
    END
    Qu'ai-je utilisé pour condition ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charindex('(', co_orga) > 0 and charindex(')', co_orga) > charindex('(', co_orga)
    CHARINDEX permet de renvoyer la position d'un caractère dans une chaîne.
    Par exemple, charindex('B' , 'ABC') renverra 2. Par contre si je cherche charindex('D' , 'ABC'), alors le retour sera 0 car D n'existe pas dans ABC.
    Donc ici la condition charindex('(', co_orga) > 0 permet de m'assurer de l'existence de la parenthèse ouvrante.
    J'ai apposé une seconde contrainte dans cette condition : and charindex(')', co_orga) > charindex('(', co_orga) qui m'indique qu'il existe une parenthèse fermante située après la parenthèse ouvrante.

    Si ces deux conditions sont vérifiées, alors je vais évaluer condition_vraie.
    J'ai utilisé cette expression pour condition_vraie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substring(co_orga, charindex('(', co_orga) + 1, charindex(')', co_orga) - charindex('(', co_orga) - 1)
    La fonction SUBSTRING permet d'extraire une chaîne de caractères depuis une autre chaîne.
    Elle prend trois arguments : la chaîne principale, la position à partir de laquelle on souhaite extraire et la longueur de la chaîne à extraire.
    Si j'écris : substring('Bonjour Eskive', 9, 6), je vais récupérer Eskive.

    Dans vos données les positions des parenthèses ne sont pas connues à l'avance, il faut donc les évaluer.
    Je réécris la formule pour que vous voyez bien les trois arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    substring( co_orga
             , charindex('(', co_orga) + 1
             , charindex(')', co_orga) - charindex('(', co_orga) - 1
             )
    Donc le premier argument, c'est la chaîne à extraire, c'est simplement votre colonne co_orga.
    Le deuxième argument c'est le point de départ de la chaîne à extraire, la position de la parenthèse ouvrante + 1 (le +1 pour ne pas récupérer la parenthèse).
    Le dernier argument est la longueur de la chaîne à extraire, soit la position de la parenthèse fermante moins la position de la parenthèse ouvrante, -1 toujours pour éviter de récupérer une parenthèse de trop.

    Et enfin la condition_fausse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substring(co_orga, len(co_orga) - charindex('/', reverse(co_orga)) + 3, len(co_orga))
    Je réécris afin de bien voir les trois paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    substring( co_orga
             , len(co_orga) - charindex('/', reverse(co_orga)) + 3
             , len(co_orga)
             )
    Le premier argument, c'est la chaîne à extraire, c'est simplement votre colonne co_orga.
    Le deuxième argument ici c'est un peu plus compliqué. On veut partir du dernier "/". Hors le dernier caractère d'une chaîne est le premier de la chaîne inversée. C'est pour cela que j'ai utilisé cette expression : charindex('/', reverse(co_orga)).
    La fonction REVERSE inverse une chaîne : reverse('ABCD') renvoie 'DCBA'.

    Comme on a inversé la chaîne et qu'on veut le point de départ par rapport à la chaîne "à l'endroit", je soustrais ce résultat de la longueur de la chaîne. J'ai ainsi la position du dernier "/". Le +3 est pour éviter de prendre des espaces en trop.
    Le dernier argument dans d'autres SGBD est facultatif mais ce n'est pas le cas avec SQL-Server, comme je veux toutes les informations à partir de ce dernier "/" je lui demande la longueur totale de co_orga, ainsi je récupère la totalité de ce qu'il reste.

    Allez, bon courage pour terminer votre requête.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Super merci pour toute cette explication, avec cela si je trouve pas je suis vraiment une buse et j'arrête le code

    Merci bien et encore

  9. #9
    Membre éclairé
    Avatar de Wachter
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2008
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 404
    Points : 734
    Points
    734
    Par défaut
    Bonjour,

    Une petite aide concernant ce point :
    Il faudrait que si co_orga ne contient ni () ni / que la colonne libelle contienne la valeur de co_orga
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHEN CHARINDEX('(', CO_ORGA) = 0 AND CHARINDEX(')', CO_ORGA) = 0 AND CHARINDEX('/', CO_ORGA) = 0 THEN CO_ORGA
    -- OU
    WHEN REPLACE(REPLACE(REPLACE(CO_ORGA, '(', ''), ')', ''), '/', '') = CO_ORGA THEN CO_ORGA
    Le code est à placer dans le CASE Libellé.
    Code parrain certification Voltaire : NTMPH759

Discussions similaires

  1. Execution d'un script SQL
    Par Drahu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/03/2004, 16h55
  2. Génération de script SQL avec les données
    Par borgfabr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/03/2004, 13h57
  3. Exécuter un script SQL
    Par borgfabr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/03/2004, 08h47
  4. create user, affectation droits et scripts sql
    Par hirochirak dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/02/2004, 10h21
  5. script SQL : affectation de variables
    Par Laura dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/10/2003, 21h32

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