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 :

Remplacement cases vides


Sujet :

SAS Base

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Remplacement cases vides
    Bonjour à tous,

    j'ai un petit problème concernant les remplacements d'une valeur vide.
    Voici comment se présente ma base:

    Numeroclient Porduitacheté M1 M2 M3 M4 M5
    1 X 2 . 3 . 2
    1 Y . 5 . 3 .
    1 Z 1 3 1 4 1
    2 X 1 4 3 1 .
    2 Y . . . . 2
    3 X 2 3 2 . .
    3 Y . . . 2 4


    En fait je souhaiterais remplacer toutes les cases vides du produit X par les valeurs du produit Y en sachant qu'il faut que ce soit fait pour chaque client qui détient le produit X et Y.

    A la fin ça doit donner (seul le produit X reste) :

    Numeroclient Porduitacheté M1 M2 M3 M4 M5
    1 X 2 5 3 3 2
    1 Z 1 3 1 4 1
    2 X 1 4 3 1 2
    3 X 2 3 2 2 4

    Ma base est grande (plus de 4 millions de clients), je n'ai pas d'idée pour résoudre ce problème. Si quelqu'un a une idée.....

    Merci à tous,

    Dan

  2. #2
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Hello,

    Une solution en sql ...

    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
    DATA TEST;
    INPUT Numeroclient Porduitacheté $1. M1 M2 M3 M4 M5;
    cards;
    1 X 2 . 3 . 2
    1 Y . 5 . 3 .
    1 Z 1 3 1 4 1
    2 X 1 4 3 1 .
    2 Y . . . . 2
    3 X 2 3 2 . .
    3 Y . . . 2 4
    4 Y . 5 . 1 4
    RUN;
     
    PROC SQL;
       CREATE TABLE TEST2 AS SELECT
         Numeroclient,
         "X" AS Porduitacheté,
         SUM (M1) AS M1,
         SUM (M2) AS M2,
         SUM (M3) AS M3,
         SUM (M4) AS M4,
         SUM (M5) AS M5
       FROM TEST
         WHERE Numeroclient IN 
              (SELECT DISTINCT Numeroclient 
               FROM TEST 
                   WHERE Porduitacheté IN ("X", "Y") 
                   GROUP BY Numeroclient 
                   HAVING COUNT(DISTINCT Porduitacheté) > 1) 
            AND Porduitacheté NE "Z"
        GROUP BY Numeroclient
     
    UNION 
     
    SELECT 
    Numeroclient, Porduitacheté,M1,M2,M3,M4,M5 FROM TEST
    WHERE Porduitacheté EQ "Z"
    ORDER BY Numeroclient;
     
    QUIT;

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Hello,

    Mille merci pour cette réponse super rapide, je vais l'essayer desuite!!

    Dan

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Re,

    j'ai un petit problème avec le code,
    en fait il calcul convenablement la bonne ligne mais il conserve les lignes initiales.
    Pour info je l'ai adapté à la base et j'ai supprimer les valeurs "Z" de la variable produitacheté.

    je trouve des choses de ce genre:

    exemple:
    Avant l'application du programme:

    Numeroclient produitacheté M1 M2 M3 M4 M5
    1 X 1 2 4 5 .
    1 Y . . . . 2


    Après l'appli du programme:

    Numeroclient produitacheté M1 M2 M3 M4 M5
    1 X 1 2 4 5 .
    1 Y . . . . 2
    1 X 1 2 4 5 2

    Je vois pas où est le problème.....

    Voila le code:

    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
    PROC SQL;
       CREATE TABLE TEST2 AS SELECT
         NUMCLI,
         "PACHET" AS PRODUIT,
         SUM (MONT082011) AS MONT082011,				
         SUM (MONT092011) AS MONT092011,
         SUM (MONT102011) AS MONT102011,
         SUM (MONT112011) AS MONT112011,
         SUM (MONT122011) AS MONT122011,
         SUM (MONT012012) AS MONT012012,
         SUM (MONT022012) AS MONT022012,
         SUM (MONT032012) AS MONT032012,
         SUM (MONT042012) AS MONT042012,
         SUM (MONT052012) AS MONT052012,
         SUM (MONT062012) AS MONT062012,
         SUM (MONT072012) AS MONT072012,
         SUM (MONT082012) AS MONT082012
       FROM FILTER_FOR_BV1_SAS7BDAT_0003
         WHERE NUMCLI IN 
              (SELECT DISTINCT NUMCLI
               FROM FILTER_FOR_BV1_SAS7BDAT_0003 
                   WHERE PRODUIT IN ("PACHET", "PNACHET") 
                   GROUP BY NUMCLI HAVING COUNT(DISTINCT PRODUIT) > 1) 
     
        GROUP BY NUMCLI 
     
     
     UNION 
     
    SELECT 
    NUMCLI, PRODUIT,MONT082011,	MONT092011,	MONT102011,	MONT112011,	MONT122011,	MONT012012,	MONT022012,	MONT032012,	MONT042012,	MONT052012,	MONT062012,	MONT072012,	MONT082012
     FROM FILTER_FOR_BV1_SAS7BDAT_0003 
     
    ORDER BY NUMCLI;
     
     
     
    QUIT;

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 114
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    Le problème vient de ton union. Si tu ne fais pas de condition dans ton union il va t’insérer les mêmes lignes qui t'ont servi a faire le remplacement. Du coup si tu ne veux pas insérer les Z, ne fait pas la "clause" UNION.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Bonjour,

    le premier select retourne la valeur fusionnée
    et le second les valeurs initiales (il n'y a pas de filtre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 X 1 2 4 5 .
    1 Y . . . . 2

  7. #7
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Hello,
    tu peux utiliser la fonction coalesce,
    Exemple en SQL:
    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
     
    DATA TEST;
    INPUT Numeroclient Porduitachete $1. M1 M2 M3 M4 M5;
    cards;
    1 X 2 . 3 . 2
    1 Y . 5 . 3 .
    1 Z 1 3 1 4 1
    2 X 1 4 3 1 . 
    2 Y . . . . 2 
    3 X 2 3 2 . . 
    3 Y . . . 2 4
    ;
    RUN;
     
    proc sql;
    	create table test1 as select a.Numeroclient, a.Porduitachete,
    	coalesce(a.M1,b.M1)as M1,
    	coalesce(a.M2,b.M2) as M2, 
    	coalesce (a.M3,b.M3) as M3, 
    	coalesce(a.M4,b.M4) as M4,
    	coalesce(a.M5,b.M5) as M5
    	from test(where=(Porduitachete ne 'Y')) as a 
    	inner join 
    	test (where=(Porduitachete ='Y')) as b
    	on a.Numeroclient=b.Numeroclient;
    quit;
    Tu peux aussi le faire en étape DATA, l'idée est de ressortir les clients hors "Y" dans une table à part ( TABLE1 ) et de faire une fusion avec ce qui reste ( TABLE2) et à l'aide de la fonction coalesce, tu compbles les valeurs manquantes par celles de la table 2
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup à tous pour toutes ces solutions

    Dan

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

Discussions similaires

  1. Remplacement cases vides
    Par Dav6706 dans le forum SAS Base
    Réponses: 2
    Dernier message: 27/02/2013, 10h05
  2. Comment remplacer une case vide par un zero
    Par medibasm dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 10/01/2013, 22h47
  3. Réponses: 2
    Dernier message: 28/10/2010, 14h38
  4. [RegEx] remplace espace vide dans texte
    Par alexmorel dans le forum Langage
    Réponses: 1
    Dernier message: 09/10/2006, 21h15
  5. Case vide dans un tableau
    Par argon dans le forum C
    Réponses: 12
    Dernier message: 17/09/2006, 17h18

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