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 :

coalesce VS union dans proc sql


Sujet :

SAS Base

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut coalesce VS union dans proc sql
    Bonjour,

    Dans SAS si j'utilise une proc sql avec un union comme ceci :

    Citation Envoyé par SAS
    create table mytable as

    select field1 , field2 , field3
    from mystarttable
    where cats(field1,'-',field2) = /* condition */
    and field2 is not null
    union
    select field1 , field2 , field3
    from mystarttable
    where cats(field1) = /* condition */
    and field2 is null ;
    Et qu'après je décide d'utiliser la fonction "coalesce" :

    Citation Envoyé par SAS
    create table mytable as

    select field1 , field2 , field3
    from mystarttable
    where cats(field1,'-',coalesce(field2,' ') )= /* condition */ ;
    Pour vous les résultats sont les mêmes ou sont différents ?

  2. #2
    Membre éprouvé
    Avatar de Stackware
    Homme Profil pro
    ArchiDuc de la Sasserie
    Inscrit en
    Juillet 2013
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ArchiDuc de la Sasserie
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 439
    Points : 1 017
    Points
    1 017
    Billets dans le blog
    4
    Par défaut
    Salut,
    Je ne suis pas un expert du langage, mais il me semble que dans le 1er cas tu peux appliquer 2 conditions, alors que dans le 2ème, tu n'en as qu'une.
    Sur le papier, sauf erreur, ça ne peut pas donner le même résultat, sauf si on est dans certains cas particuliers.
    Peux-tu décrire quelques cas, avec des valeurs attendues?

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Bonjour

    Citation Envoyé par Stackware Voir le message
    Peux-tu décrire quelques cas, avec des valeurs attendues?
    Dans notre cas " field3 " est une clef primaire strictement unique de type identifiant . Par exemple "ID123456" ou "ID123457" ...

    " field1 " est un code gestion qui peut prendre des valeurs comme "00" , "01" , "02" ... , " field1 " est strictement rempli et jamais vide comme champ
    " field2 " est un code gestion qui peut prendre des valeurs comme "10" , "11" , "12" ... , " field2 " est champ qui peut être vide ou bien rempli.

    On imagine le jeu de données suivant :

    field1;field2;field3
    01;10;ID123456
    01;11;ID123456
    02;;ID123456
    02;;ID123457
    02;11;ID123457
    02;11;ID123458
    09;19;ID123459
    09;;ID123459

  4. #4
    Membre éprouvé
    Avatar de Stackware
    Homme Profil pro
    ArchiDuc de la Sasserie
    Inscrit en
    Juillet 2013
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ArchiDuc de la Sasserie
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 439
    Points : 1 017
    Points
    1 017
    Billets dans le blog
    4
    Par défaut
    Salut,
    Si je comprends bien le jeu de données, je n'ai par contre pas compris les actions qui suivent. Tous les cas du jeu de données ne sont peut-être pas cités?
    cas 1 : valeur;null;ID1
    cas 2 : valeur;valeur;ID1
    cas 3 : valeur;null;ID2
    cas 4 : valeur;null;ID3
    cas 5 : valeur;null;ID3
    cas 6 : valeur;valeur;ID4
    cas 7 : valeur;null;ID5
    cas 8 : valeur;valeur;ID6
    cas 9 : valeur;valeur;ID6
    cas 10 : ...

    Quels sont les cas de couples de valeurs que l'on peut rencontrer, et avec quelles occurrences ?
    Quel est le résultat attendu dans la 2ème table, et avec quelles conditions?

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Bonjour ,

    Citation Envoyé par Stackware Voir le message
    Si je comprends bien le jeu de données, je n'ai par contre pas compris les actions qui suivent.
    J'ai une table d'entrée qui peut contenir 2 types de cas de remplissage "valeur1;valeur2;IDX" ou bien "valeur1;null;IDX" . "valeur1" est strictement rempli , "valeur2" peut être rempli ou null

    Citation Envoyé par Stackware Voir le message
    Tous les cas du jeu de données ne sont peut-être pas cités?
    On va faire un cas simple :

    "valeur1" peut prendre les valeurs "00" à "09". "valeur2" peut prendre les valeurs "10" à "19" ou "null" .

    Citation Envoyé par Stackware Voir le message
    Quels sont les cas de couples de valeurs que l'on peut rencontrer, et avec quelles occurrences ?
    Voici la liste des cas

    Code csv : 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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    valeur1;valeur2
    00;10
    00;11
    00;12
    00;13
    00;14
    00;15
    00;16
    00;17
    00;18
    00;19
    00;null
    01;10
    01;11
    01;12
    01;13
    01;14
    01;15
    01;16
    01;17
    01;18
    01;19
    01;null
    02;10
    02;11
    02;12
    02;13
    02;14
    02;15
    02;16
    02;17
    02;18
    02;19
    02;null
    03;10
    03;11
    03;12
    03;13
    03;14
    03;15
    03;16
    03;17
    03;18
    03;19
    03;null
    04;10
    04;11
    04;12
    04;13
    04;14
    04;15
    04;16
    04;17
    04;18
    04;19
    04;null
    05;10
    05;11
    05;12
    05;13
    05;14
    05;15
    05;16
    05;17
    05;18
    05;19
    05;null
    06;10
    06;11
    06;12
    06;13
    06;14
    06;15
    06;16
    06;17
    06;18
    06;19
    06;null
    07;10
    07;11
    07;12
    07;13
    07;14
    07;15
    07;16
    07;17
    07;18
    07;19
    07;null
    08;10
    08;11
    08;12
    08;13
    08;14
    08;15
    08;16
    08;17
    08;18
    08;19
    08;null
    09;10
    09;11
    09;12
    09;13
    09;14
    09;15
    09;16
    09;17
    09;18
    09;19
    09;null

    Citation Envoyé par Stackware Voir le message
    Quel est le résultat attendu dans la 2ème table, et avec quelles conditions?
    Je veux que la table 2 soit l'union de 2 tables : table 1bis > "valeur1;valeur2;IDX" union table 1ter > "valeur1;null;IDX" = table 2 .

    /* condition */ > est une sous requête sur une autre table (par exemple "select champ1, champ2 from autretable3 ;" ) .

    Comme "valeur2" peut être null , il est difficilement concevable de faire une requête sur vide ... SAS ne revera rien ...

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Bonjour,

    Après contrôle est ce que ces 2 requêtes :

    Code SAS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table mytable as
     
    select field1 , field2 , field3
    from mystarttable
    where cats(field1,'-',field2) = /* condition */
    and field2 is not null
    union
    select field1 , field2 , field3
    from mystarttable
    where cats(field1) = /* condition */
    and field2 is null ;

    sont égales à celle ci :

    Code SAS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table mytable as
     
    select field1 , field2 , field3
    from mystarttable
    where cats(field1,'-',coalesce(field2,' ') )= /* condition */ ;

    J'ai trouvé un résultat identique .

    / ! \ attention " coalesce() " est une fonction SAS dont il convient de se méfier comme la peste. Eviter autant que possible son utilisation et priviligez le "union" / ! \

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

Discussions similaires

  1. Pointer champs de table dans proc sql
    Par granchef dans le forum Macro
    Réponses: 3
    Dernier message: 27/02/2014, 16h12
  2. Utilisation de la clause exists dans proc sql
    Par enicnath dans le forum SAS Base
    Réponses: 2
    Dernier message: 02/09/2013, 16h11
  3. [SQL] Fonctionnement WHERE dans PROC SQL sous SAS
    Par essai_sas dans le forum SAS Base
    Réponses: 1
    Dernier message: 05/11/2011, 17h38
  4. Macro variable dans PROC SQL : fusion de SELECT
    Par docteurdorian dans le forum Macro
    Réponses: 6
    Dernier message: 18/11/2010, 14h48
  5. [SQL Server 8] Un UNION dans une VIEW
    Par Baquardie dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/05/2006, 21h36

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