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

SAS Base Discussion :

Tableau sur 12 mois glissants


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Pilote production
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pilote production

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Tableau sur 12 mois glissants
    Bonjour,

    J'apprends actuellement à utiliser SAS (via google principalement) suite à une prise de fonctions.
    On me demande un tableau de bord sur 12 mois glissant.
    En recherchant sur internet, voici ce que j'ai réussi à faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    %let mois_douze =%eval(%sysfunc(intnx(month,%sysfunc(date()),-12,beginning)));
    %let mois_douze =%eval(%sysfunc(intnx(month,%sysfunc(date()),-12,end))) ;
    %let mois_onze =%eval(%sysfunc(intnx(month,%sysfunc(date()),-11,beginning)));
    %let mois_onze =%eval(%sysfunc(intnx(month,%sysfunc(date()),-11,end))) ;
    ...etc jusque m-1.
    Puis :


    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
     
    proc sql;
    create table mois12 as
    select var1, var2, count(var3) as Mois_douze
    from gra.sdsui 
    where var1 in ('xxx', 'xxx', 'xxx', 'xxx') 
    and var2= (&mois_douze.)
    group by var1;
    quit;
     
    proc sql;
    create table mois11 as
    select var1, var2, count(var3) as Mois_onze
    from gra.sdsui 
    where var1 in ('xxx', 'xxx', 'xxx', 'xxx') 
    and var2= (&mois_onze.)
    group by var1;
    quit;
     
    data mensuel;
    merge mois12 mois11;
    run;
    etc...
    Ca ne me paraît vraiment pas optimum comme solution. D'autant que je souhaiterais que count(var3) soit automatiquement remplacé par le mois auquel il se réfère (j'ai essayé de remplacer par (&mois_douze.), mais ça m'affiche une date en 5 chiffres).

    Je vous remercie d'avance.

  2. #2
    Membre du Club
    Femme Profil pro
    Formatrice en SAS (en ligne)
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Formatrice en SAS (en ligne)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Points : 46
    Points
    46
    Par défaut
    Bonjour,
    Pourrais-tu nous fournir un petit jeu de données sur lequel on pourrait faire tourner ton code pour mieux comprendre ce que tu recherches.
    Bien à toi
    Véronique

  3. #3
    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.
    Si je comprends bien ton besoin, tu pourrais faire une seule proc SQL avec un comptage selon VAR1 et VAR2, puis transposer (PROC TRANSPOSE) le résultat avec VAR1 comme pivot (BY), VAR2 formaté comme noms de nouvelles colonnes (ID et FORMAT) et ton comptage comme donnée pivotée (VAR).
    Peut-être n'y a-t-il même pas besoin de macros si tu intègres directement ta fenêtre de temps dans le WHERE du SQL.
    Bon courage.
    Olivier

  4. #4
    Membre à l'essai
    Homme Profil pro
    Pilote production
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pilote production

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Voilà ce que je souhaite faire :
    la var1 correspond à un groupe de production
    la var2 à une date de stockage de produits (4 types)
    la var3 au nombre de produit

    Ce que je souhaite, c'est avoir un tableau qui ressemble à ça :
    Nom : test.png
Affichages : 718
Taille : 7,4 Ko

    Je veux aller chercher chaque mois, pour chaque groupe de production, le nombre de produits stockés et que le nom de la colonne s'affiche automatique avec le mois concerné.
    Le but étant d'envoyer ce tableau par mail en automatique chaque mois.

    édition : après vérification, la formule ci-dessous ne fonctionne pas pour borner le mois de décembre 2019. Elle me donne des chiffres très en deçà de la réalité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %let mois_un =%eval(%sysfunc(intnx(month,%sysfunc(date()),-1,beginning)));
    %let mois_un =%eval(%sysfunc(intnx(month,%sysfunc(date()),-1,end))) ;
    J'espère que mes explications sont plus claires ^^

  5. #5
    Membre du Club
    Femme Profil pro
    Formatrice en SAS (en ligne)
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Formatrice en SAS (en ligne)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Points : 46
    Points
    46
    Par défaut
    Merci pour les explications.

    Tu ne parles que de 3 variables alors qu'il me semble que tu en as besoin de 4. Donc tu auras peut-être besoin de dériver la quatrième pour adapter cet exemple.

    Je ne sais pas si tu veux par exemple
    - du 31 janvier 2019 au 30 janvier 2020 (aujourd'hui) ou
    - du 1er janvier 2019 au 30 janvier 2020 (aujourd'hui) ou
    - du 1er février 2019 au 30 janvier 2020 (aujourd'hui) - j'ai opté pour cette dernière solution.

    J'ai assumé que tu avais des dates avec les jours et que tu devais encore faire la somme pour chaque mois. J'ai pris proc sql mais tu peux envisager une autre méthode comme un proc freq.

    Ensuite, tu pourras toujours utiliser proc report au lieu de proc print pour affiner l'affichage.

    Je te propose cette solution.

    En espérant que cela aide.

    Véronique

    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
    53
    54
    55
    56
    57
    58
    59
    data test;
        grp='1'; type='A'; dt='12MAR2019'd; cnt=2;  output;
        grp='1'; type='A'; dt='02MAR2019'd; cnt=1;  output;
        grp='1'; type='B'; dt='12MAR2019'd; cnt=12; output;
        grp='1'; type='B'; dt='02MAR2019'd; cnt=10; output;
        grp='1'; type='A'; dt='25MAR2019'd; cnt=4;  output;
        grp='1'; type='A'; dt='08MAR2019'd; cnt=9;  output;
        grp='1'; type='B'; dt='12MAR2019'd; cnt=5;  output;
        grp='1'; type='B'; dt='15MAR2019'd; cnt=3;  output;
        grp='1'; type='A'; dt='12FEB2019'd; cnt=2;  output;
        grp='1'; type='A'; dt='02FEB2019'd; cnt=1;  output;
        grp='1'; type='B'; dt='12FEB2019'd; cnt=19; output;
        grp='1'; type='B'; dt='02FEB2019'd; cnt=10; output;
        grp='1'; type='A'; dt='25FEB2019'd; cnt=4;  output;
        grp='1'; type='A'; dt='08FEB2019'd; cnt=5;  output;
        grp='1'; type='B'; dt='12FEB2019'd; cnt=5;  output;
        grp='1'; type='B'; dt='15FEB2019'd; cnt=23; output;
     
        grp='2'; type='A'; dt='12MAR2019'd; cnt=52; output;
        grp='2'; type='A'; dt='02MAR2019'd; cnt=0;  output;
        grp='2'; type='B'; dt='12MAR2019'd; cnt=22; output;
        grp='2'; type='B'; dt='02MAR2019'd; cnt=8;  output;
        grp='2'; type='A'; dt='25MAR2019'd; cnt=8;  output;
        grp='2'; type='A'; dt='08MAR2019'd; cnt=7;  output;
        grp='2'; type='B'; dt='12MAR2019'd; cnt=5;  output;
        grp='2'; type='B'; dt='15MAR2019'd; cnt=3;  output;
        grp='2'; type='A'; dt='12FEB2019'd; cnt=2;  output;
        grp='2'; type='A'; dt='02FEB2019'd; cnt=15; output;
        grp='2'; type='B'; dt='12FEB2019'd; cnt=2;  output;
        grp='2'; type='B'; dt='02FEB2019'd; cnt=10; output;
        grp='2'; type='A'; dt='25FEB2019'd; cnt=4;  output;
        grp='2'; type='A'; dt='08FEB2019'd; cnt=5;  output;
        grp='2'; type='B'; dt='12FEB2019'd; cnt=5;  output;
        grp='2'; type='B'; dt='15FEB2019'd; cnt=23; output;
     
        /*excluded - FEB 2019 à JAN 2020 (mois en cours)*/
        grp='3'; type='B'; dt='11JAN2019'd; cnt=5;  output; 
    run;
     
     
    proc sql;
        create table _test as
        select grp, type, intnx('month',dt,0,'begin') as xxdt format=monyy7., sum(cnt) as sum_cnt
        from test
        where intnx('month',today(),-11,'begin') <= dt <= today()
        group by grp, type, xxdt;
    quit;
     
    proc print data=_test noobs;
    run;
     
    proc transpose data=_test out=_test (drop=_name_);
        by grp type;
        var sum_cnt;
        id xxdt;
    run;
     
    proc print data=_test noobs;
    run;

  6. #6
    Membre à l'essai
    Homme Profil pro
    Pilote production
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pilote production

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    J'ai fait quelques ajustement par rapport à la date, mais c'est parfait !
    Merci beaucoup pour le très gros coup de main.

    Je vais faire des recherches sur intnx que je ne maitrise pas du tout.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/05/2010, 17h30
  2. Requete pour un résultat sur 12 mois glissants
    Par Franck_P dans le forum Développement
    Réponses: 10
    Dernier message: 17/11/2009, 17h53
  3. Recherche par date sur 12 mois glissant
    Par kiki.gaby dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/10/2009, 16h17
  4. Optimisation Vue sur 12 mois glissants
    Par mout1234 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/06/2009, 13h42
  5. Somme cumulative sur 12 mois glissant
    Par Ptij16 dans le forum Deski
    Réponses: 6
    Dernier message: 13/07/2007, 10h24

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