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 :

Idea grouper enregistrements d'un champ


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 16
    Points
    16
    Par défaut Idea grouper enregistrements d'un champ
    Voici ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Table A (Firstname, departementid)
    Hansen | 5
    Tove | 5
    Kari | 2
    Pettersen | 1
    Timo | 2
    Je cherche un idée de requête SQL (no mysql) pour produire le résultat suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    5 | Hansen, Tove
    2 | Kari, Timo 
    1 | Pettersen
    Merci pour vos réponse.

  2. #2
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Tu cherches donc à regrouper par département les personnes de ta table.

    As-tu un début de requête ?

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 82
    Points : 140
    Points
    140
    Par défaut
    Salut jzb10n,

    Ce genre de requête est assez courant et la plupart des SGBB de proposent des solutions permettant de faciliter l'écriture de requêtes renvoyant un pareil résultat. Par contre, je ne connais pas 'no mysql'. Veux-tu dire autre que MySQL? Ou 'no mysql' est un outil exotique développé par une certaine compagnie exotique?

    Bref, avec Oracle (11G), tu peux faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE A 
    (
      Firstname VARCHAR2(10), 
      departementid NUMBER(10)
    );
     
    INSERT INTO A VALUES('Hansen', 5);
    INSERT INTO A VALUES('Tove', 5);
    INSERT INTO A VALUES('Kari', 2);
    INSERT INTO A VALUES('Pettersen', 1);
    INSERT INTO A VALUES('Timo', 2);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT departementid, LISTAGG(Firstname, ', ') WITHIN GROUP (ORDER BY Firstname)
      FROM jzb10n
     GROUP BY departementid
      ORDER BY 1 DESC;
    Un petit mot d'explication petu-être? GROUP BY est une clause assez courante. Et comme son nom le fait sous-entendre, cette clause groupe les données par departement (dans ce cas-ci).

    La fonction LISTAGG permet de concaténer une valeur sur ces groupes (WITHIN GROUP). Nous choisissons comme délimiteur une ',' et nous trions les valeurs sur le Firstname. Je ne pense pas que cela soit très compliqué à comprendre?

    Par contre, en 10g, c'est un peu plus complexe vu que la fonction analytique listagg n'a été rajouté que depuis Oracle 11g.

    Ce qui suit fonctionne avec Oracle 10g
    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
     
    WITH t1 AS 
    (
      SELECT Firstname, 
             departementid, 
             row_number() OVER(PARTITION BY departementid ORDER BY Firstname) AS rn
        FROM jzb10n
    )
      SELECT departementid, 
             SUBSTR(SYS_CONNECT_BY_PATH(Firstname, ', '), 3) as l
        FROM t1 
       WHERE CONNECT_BY_ISLEAF = 1
       START WITH rn = 1
      CONNECT BY rn = prior rn + 1
             AND departementid = prior departementid
     ORDER BY 1 DESC;
    Comme tu vois, j'ai une factored sub-query t1. Cette requête genère également un row_number. C'est un numéro de séquence est généré par département pour chacun des noms. Exécute la sous-requete et tu comprendra.

    Ensuite, la requête principale est une requête récursive permettant de faire la concaténation en commencant par les noeux numérotés 1 dans t1 et en remontant la structure (CONNECT BY ... PRIOR). C'est une des solutions pour faire ce genre de chose dans Oracle 10g. Il en existe d'autres mais celle-ci est ma préférée (car toute personne comprenant le SQL pourrait facilement la comprendre);

    Si tu utilises un autre SGBD (SQL Server...), je suis sûr que tu auras une fonction comme LISTAGG disponible.

    N'hésite pas si tu as d'autres questions,

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Ni LISTAGG ni CONNECT BY ne font partit du SQL.

    Pour faire cela il faut utiliser une requête récursive introduite par une CTE, comme indiquée ici :
    http://sqlpro.developpez.com/cours/s...te-recursives/

    En particulier exemple IV-D

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 14
    Points : 16
    Points
    16
    Par défaut
    Veux-tu dire autre que MySQL?
    OUI.

    J'ai lu vos réponse merci. En fait j'ai deux databases sur lesquelles je travaille, MYSQL et ORACLE, donc je cherchais plutôt une fonction ou astuce pour faire passer la même requête sans la modifier sur les deux plateformes mais aussi sur une plateforme comme SQLserver sans devoir la modifier.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Comme ce que vous cherchez à faire est de la cosmétique, qui n'est pas le boulot du SGBD mais celui du logiciel présentant les données, vous êtes amenés à utiliser des fonctions spécifiques selon le SGBD utilisé.

    La bonne solution : sortir la cosmétique du SGBD et faire une simple requête SELECT puis traiter la présentation en regroupant les noms par departementid dans le logiciel.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

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

Discussions similaires

  1. comment concaténer les enregistrements d'un champ donné ???
    Par c_moi_c_moi dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 23/03/2006, 16h11
  2. supprimer un enregistrement si un champ est vide
    Par kuhnden dans le forum Access
    Réponses: 2
    Dernier message: 15/02/2006, 19h39
  3. Recherche d'enregistrments dans un champs
    Par Marie D dans le forum Access
    Réponses: 16
    Dernier message: 19/09/2005, 09h01
  4. Exécuter une requete enregistrée dans un champ
    Par pascalT dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 10/03/2005, 10h46
  5. Réponses: 4
    Dernier message: 29/09/2004, 16h08

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