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

Macro Discussion :

SAS : Agrégation d'une colonne en SQL


Sujet :

Macro

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2020
    Messages : 4
    Points : 3
    Points
    3
    Par défaut SAS : Agrégation d'une colonne en SQL
    Bonjour,

    J'ai une requête SQL qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select titre, sum(quantite), genre
    from table
    group by titre ;
    En résultat, j'ai bien ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tata 10 truc
    tata 5 bidule
    titi 20 machin
    toto 7 trucmuche
    toto 15 autre
    ... mais, j'ai aussi besoin d'appliquer une fonction de concaténation sur la colonne genre afin d'obtenir ce résultat là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tata 15 truc, bidule
    titi 20 machin
    toto 21 trucmuche, autre
    Ça existe dans d'autres SGBD, comme le PostgreSQL par exemple, mais pour SAS, je ne trouve pas.


    Avez-vous une idée ?

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Guillaume.
    Déjà ton résultat me semble étrange. Avec ta requête, la somme devrait être la même pour tous les titres identiques. Mais ce n'est pas la question.
    Avec GROUP BY, dans SAS on ne peut réaliser que des statistiques, pas des opérations plus générales.

    Le moyen de faire ça en SAS est de passer par une étape DATA, un SET BY et un RETAIN pour concaténer au fur et à mesure les valeurs de genre au sein du même titre. Tu peux en profiter pour calculer les sommes, ce qui remplacera totalement la requête SQL.
    Bon courage.
    Olivier

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2020
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci Olivier.

    Je débute sous SAS et malgré mes recherches je ne trouve pas comment bien rédiger cette étape DATA. Comment ferais-tu ?


    Cordialement,
    Guillaume

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Guillaume.
    D'abord il faut que ta table soit triée. Ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DATA resultat ;
      SET table ;
      BY titre ;
      LENGTH genres $ 10000 ;
      RETAIN qt_tot genres ;
      IF FIRST.titre THEN DO ; /* 1e obs d'un titre = initialisation */
       qt_tot = 0 ;
       genres = "" ;
      END ;
      qt_tot = SUM(qt_tot, quantite) ; /* plutôt que qt_tot + quantite en cas de valeur manquante */
      genres = CATX(",", genres, genre) ; /* concaténation */
      IF LAST.titre THEN OUTPUT ; /* dernière obs d'un titre = sauvegarde dans le résultat */
      DROP genre quantite ; /* agrégées et donc devenues inutiles à conserver */
    RUN ;
    Bon courage.
    Olivier

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2020
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour Oliver,

    Merci beaucoup pour ton aide. J'ai pu adapter ton exemple à mon cas d'exploitation.


    Cordialement,

    Guillaume

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/09/2013, 16h53
  2. Réponses: 7
    Dernier message: 20/12/2012, 18h06
  3. récupérer une colonne en sql+java
    Par xiwi16 dans le forum Général Java
    Réponses: 3
    Dernier message: 19/07/2012, 14h40
  4. Obtenir la taille max d'une colonne PL/SQL
    Par Syrmonsieur dans le forum PL/SQL
    Réponses: 5
    Dernier message: 08/06/2008, 17h41
  5. Supprimer une colonne sous SQL Serveur 2000
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/07/2003, 12h24

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