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

SQL Oracle Discussion :

UPDATE regrouper les valeurs d'un champ


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut UPDATE regrouper les valeurs d'un champ
    Bonjour tout le monde,

    voici en quelques lignes mon pb:

    j'ai une table contenant des commandes des clients avec plusieurs :

    Num_Cde Num_lignes et autres champs

    chaque commandes peut contenir plusieurs lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Num_Cde   Num_ligne 
    C001              1
    C001              2
    C001              3
    C002              4
    C002              5
    C002              6
    vous remarquez bien que le champ Num_ligne contient les valeurs de 1 jusqu'à n (nombre de lignes dans la table)

    Je cherche avec une requête UPDATE à regrouper les valeurs de ce champs pour chaque commande.Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Num_Cde   Num_ligne 
    C001              1
    C001              2
    C001              3
    C002              1
    C002              2
    C002              3
    j'ai voulu utilisé le rownum mais sans résultat.

    quelqu'un pourrait il m'aider svp.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    j'ai voulu utilisé le rownum
    Oracle ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Tu utilises quel SGBD ?

    Si c'est Oracle tu peux utiliser row_number() over(...)-rank() over(...)+1.

    Sinon dans une sous-requete tu recupère la valeur min de Num_Ligne en groupant par Num_Cde.
    Dans la requete principale tu fais ton rownum-min.

    Quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T1.Num_Dde, rownum-T2.minLigne+1
    FROM T1
      JOIN (
          select Num_Dde, min(Numero_Ligne) minLigne
            from T1
        group by Num_Dde
        ) T2 ON T1.Num_Dde = T2.Num_Dde 
    ORDER BY T1.Num_Dde

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row_number() over (partition by Num_Cde order by Num_ligne) as rn
    Dans un SELECT pas de problème, pour l'update des données ça peut être problématique, avec MERGE je ne pense pas que tu puisse mettre à jour la condition de jointure et surtout ça pose un problème pour les insertions/suppression/maj futures où tu auras une colonne à précautionneusement gérer.

    Alors qu'avec la table telle qu'elle est définit avec Num_ligne alimentée par une séquence pas de problème, crée une vue avec le row_number si tu as régulièrement besoin de l'affichage numéroté par Num_Cde.

  5. #5
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut
    j'utilise le SGBD ORACLE 11g

Discussions similaires

  1. Regrouper des données selon les valeurs d'un champ
    Par ecarbill dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/06/2015, 07h30
  2. Réponses: 1
    Dernier message: 17/02/2011, 11h08
  3. Réponses: 3
    Dernier message: 13/01/2009, 16h55
  4. Requete SELECT : prendre toutes les valeurs pour 1 champ
    Par fab22montpellier dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/09/2005, 09h12
  5. Réinitialiser les valeurs d'un champ de type identify
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/01/2005, 13h39

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