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 :

Regroupement de combinaisons de données


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut Regroupement de combinaisons de données
    Bonjour,

    Voici le sujet de ma demande.

    Je possède une table avec 2 colonnes (Col1 et Col2) et j'aurai besoin par SQL de retrouver les différentes combinaison de données de la seconde colonne associées à la première colonne.

    Le mieux est que je donne un exemple.
    Ci-dessous ma table, qui représente l'association de valeur entre les 2 colonnes.
    On y constate par exemple que les valeurs 220 et 230 de la col 1 sont toutes les 2 liées aux valeurs GAR1-GAR2-GAR3 de la col2.
    Alors le but serait de sortir une seule fois la combinaison GAR1-GAR2-GAR3.

    Col1 Col2
    220 GAR1
    220 GAR2
    220 GAR3
    230 GAR1
    230 GAR2
    230 GAR3
    240 GAR1
    240 GAR2
    250 GAR1
    250 GAR3
    260 GAR1
    260 GAR2
    270 GAR2
    280 GAR2
    280 GAR3
    280 GAR4
    290 GAR3
    290 GAR4
    300 GAR1
    300 GAR2
    310 GAR2
    310 GAR4
    320 GAR1
    320 GAR3
    330 GAR2
    330 GAR3
    330 GAR4

    Le résultat final attendu serait les combinaisons suivantes :
    GAR1 -GAR2-GAR3
    GAR1 -GAR2
    GAR1 -GAR3
    GAR2
    GAR2 -GAR3-GAR4
    GAR3 -GAR4
    GAR2 -GAR4


    J'ai comme outil à ma disposition SQL alors je pensais m'appuyer sur des fonctions style GROUP BY....ainsi que l'utilisation de tables temporaires mais je ne sais pas par quel bout commencer.

    La volumétrie de ma table peut faire plusieurs millions de lignes.

    Quelqu'un pourrait t'il m'aider ?

    Un grand merci par avance.


  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 378
    Points : 39 860
    Points
    39 860
    Billets dans le blog
    9
    Par défaut
    Y a -t- il un nombre maximal connu d'avance de colonnes à restituer ?
    Ce que je veux dire c'est que dans votre exemple on obtient au pire 3 GAR bout à bout, mais faut il envisager GAR1 - GAR2 - [...] - GARn ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Y a -t- il un nombre maximal connu d'avance de colonnes à restituer ?
    Ce que je veux dire c'est que dans votre exemple on obtient au pire 3 GAR bout à bout, mais faut il envisager GAR1 - GAR2 - [...] - GARn ?
    Je ne connais pas à l'avance le nombre de GAR mais au pire, je pourrais peut être fixer un nombre maximum possible dans un premier temps.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 480
    Points
    28 480
    Par défaut
    Avec quel SGBD ? dans quelle version ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Avec quel SGBD ? dans quelle version ?
    J'utilise SQuierrel 3.7.1 qui pointe sur du DB2 V6.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 378
    Points : 39 860
    Points
    39 860
    Billets dans le blog
    9
    Par défaut
    Heu vous êtes certains de la version DB2 ?

    Par ce que pour DB2 for Z/OS (version mainframe) la V6 n'est plus maintenue depuis le 30-06-2005
    Si vous êtes sur Windows ou Linux, c'est la même chose
    Et si vous êtes sur DB2/400 (version AS/400 donc), je ne retrouve pas la date exacte de fin de garantie mais ça doit être du même tonneau

    Les infos sont accessibles ici : https://www-01.ibm.com/software/support/lifecycleapp/

    A changer d'urgence donc

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    En fait non je ne suis pas certain de la version mais je ne sais pas si çà change grand chose au problème. En résumé, je dois pouvoir alimenter en SQL dans une colonne le contenu d'un select ayant plusieurs valeurs possible.

    Col1 Col2
    220 GAR1
    220 GAR2
    220 GAR3

    doit donner :

    Col1 Col2
    220 GAR1 GAR2 GAR3


    Mais est ce faisable ? peut être pas finalement. çà ne semble pas avoir inspiré grand monde

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 378
    Points : 39 860
    Points
    39 860
    Billets dans le blog
    9
    Par défaut Si si, c'est possible (SNCF inside)
    C'est faisable en utilisant un PIVOT, la fonction n'est pas accessible directement en DB2, mais il existe plusieurs méthodes permettant d'y arriver
    Voici un lien sur ce sujet : http://fadace.developpez.com/mssql/pivot/

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    C'est faisable en utilisant un PIVOT, la fonction n'est pas accessible directement en DB2, mais il existe plusieurs méthodes permettant d'y arriver
    Voici un lien sur ce sujet : http://fadace.developpez.com/mssql/pivot/
    Merci pour ton lien et ta disponibilité face à mon problème.
    Par contre, je vois dans l'exemple avec le PIVOT qu'il faut trois variables alors que j'en ai 2.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 378
    Points : 39 860
    Points
    39 860
    Billets dans le blog
    9
    Par défaut
    Oui pardon, ce n'est pas un pivot dont vous avez besoin, mais plutôt une fonction similaire au "Group Concat" de MySQL et spécifique à ce SGBD

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    merci super !

    En testant par contre çà me ramène des associations qui n'ont pas lieu d'être

    Exemple pour ma table initiale contenant :

    CAT1 GAR1
    CAT1 GAR2
    CAT1 GAR3
    CAT2 GAR1
    CAT3 GAR1
    CAT3 GAR2

    çà me ramène çà :

    CAT1 GAR1 GAR2 GAR3
    CAT1 GAR1 GAR3 <null>
    CAT1 GAR2 GAR3 <null>
    CAT1 GAR3 <null> <null>
    CAT2 GAR1 <null> <null>
    CAT3 GAR1 GAR2 <null>
    CAT3 GAR2 <null> <null>

    alors que çà devrait me ramener que çà :

    CAT1 GAR1 GAR2 GAR3
    CAT2 GAR1 <null> <null>
    CAT3 GAR1 GAR2 <null>

    mais y'a surement quelque chose à adapter.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Pas d'équivalent au group_concat pour sql simple ?

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 378
    Points : 39 860
    Points
    39 860
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Non, il faut passer par des requêtes récursives, c'est un peu plus compliqué, mais au moins c'est normalisé

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    J'ai peur que ce soit trop complexe pour moi.
    Mon niveau en SQL est pas assez élevé.

    Si vous avez une idée plus précise de comment faire, je suis preneur.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    çà marche avec les requêtes récursives.

    Je me suis fait aidé par un DBA.

    Voici mon script pur DB2 si çà peut aider quelqu'un qui a le même besoin.

    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
    DECLARE GLOBAL TEMPORARY TABLE SESSION.TMP_COMB
      (
         TMP_CO_CATEG                Char(4)
       , TMP_CO_GAR                  Char(4)   
       , TMP_RANG_GAR  		 Integer
      )
     ON COMMIT PRESERVE ROWS ;
    COMMIT ;
     
     
    INSERT INTO SESSION.TMP_COMB VALUES ('CAT1' , 'GAR1' , '1');
    INSERT INTO SESSION.TMP_COMB VALUES ('CAT1' , 'GAR2' , '2');
    INSERT INTO SESSION.TMP_COMB VALUES ('CAT1' , 'GAR3' , '3');
    INSERT INTO SESSION.TMP_COMB VALUES ('CAT2' , 'GAR1' , '1');
    INSERT INTO SESSION.TMP_COMB VALUES ('CAT3' , 'GAR1' , '1');
    INSERT INTO SESSION.TMP_COMB VALUES ('CAT3' , 'GAR2' , '2');
     
    SELECT * FROM SESSION.TMP_COMB
    with ur;
     
     
    WITH
    phrases (phrase, CO_CATEG, RANG_GAR)
    AS
    (
    SELECT cast ( trim(TMP_CO_GAR)  as varchar(200) )  concat  ';'
          , TMP_CO_CATEG
          , TMP_RANG_GAR
    FROM   SESSION.TMP_COMB
    WHERE  TMP_RANG_GAR = 1
    UNION ALL
    SELECT  phrase concat cast(trim(TMP_CO_GAR) as varchar(200)  ) concat ';'  as phrase               
          ,TMP_CO_CATEG
          ,TMP_RANG_GAR
    FROM   SESSION.TMP_COMB AS suiv
          INNER JOIN phrases
                ON suiv.TMP_CO_CATEG = phrases.CO_CATEG
                   AND suiv.TMP_RANG_GAR = phrases.RANG_GAR + 1
    )
    , maxphrase
    AS
    (
    SELECT CO_CATEG, MAX(RANG_GAR) AS maxposition
    FROM   phrases
    GROUP  BY CO_CATEG
    )
    SELECT P.CO_CATEG, PHRASE
    FROM   phrases AS P
          INNER JOIN maxphrase AS M
                ON P.CO_CATEG = M.CO_CATEG
                   AND P.RANG_GAR = M.maxposition
    ;

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

Discussions similaires

  1. Combinaison de donnée avant FFT
    Par GuillaumeCOR dans le forum Traitement du signal
    Réponses: 4
    Dernier message: 05/04/2012, 13h17
  2. Regrouper des bases de données
    Par Jim_Crayon dans le forum Administration
    Réponses: 1
    Dernier message: 23/08/2011, 15h59
  3. [A-07] Regrouper 3 bases de données en une seule
    Par Alain7751 dans le forum Modélisation
    Réponses: 5
    Dernier message: 06/03/2009, 13h28
  4. Regroupement de bases de données
    Par smilingdreamer dans le forum Modélisation
    Réponses: 5
    Dernier message: 03/11/2008, 16h33
  5. Regroupement par plage de données consécutives.
    Par ntexcier dans le forum Administration
    Réponses: 5
    Dernier message: 06/11/2006, 09h29

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