2017-08-17 5 views
1

J'ai deux façons de faire la même chose mais je ne reçois pas les mêmes résultats. Quelle est la raison pour ça?Merge vs Proc sql

Première façon:

Proc sql; 
    Create table abc.immu as 
    select ID, DATE, CODE 
    from xyz.imm 
    where DATE between to_date('2008-01-01','YYYY-MM-DD') and to_date('2016-01-31','YYYY-MM-DD') 
    Order by CODE); 
     Quit; 

Proc sql ; 
    Create table abc.testb as 
      select CODE, description from xyz.REF_code where lower(description)like '%hep b%'; 
Quit; 

proc sort data=abc.testb; 
by code; 
run; 


data abc.testb1; 
merge abc.immu(in=a) abc.testb (in=b); 
by code; 
if a=1 and b=1; 
run; 

Deuxième façon

Create table abc.testb1 as 
     Select ID, DATE,CODE 
    From xyz.imm 
    where CODE in (select CODE from xyz.REF_code where lower(description)like '%hep b%') 
    AND DATE between to_date('2008-01-01','YYYY-MM-DD') and to_date('2016-01-31','YYYY-MM-DD') 
    Order by ID, DATE; 
    Quit; 

proc sort data=abc.testb1 nodupkey; 
by ID DATE; 
run; 

Pourquoi ne reçois pas le même résultat? N'est-ce pas deux façons différentes de réaliser la même chose?

+0

par le même résultat Je veux dire des observations – SAW

+2

to_date() fonctionne pour vous dans SAS? Ce n'est pas un code SAS, à moins que vous n'utilisiez un code d'accès, ce qui ne semble pas se produire en fonction de ce que vous avez posté. Je * pense * que les résultats peuvent différer si vous avez des doublons dans les deux tables. Exécutez PROC COMPARE pour voir où les résultats diffèrent et cela vous aidera à isoler le problème. – Reeza

+0

oui en utilisant passer, même après avoir exécuté aucune clé dup les observations ne sont pas les mêmes – SAW

Répondre

0

La meilleure estimation est que vous avez des doublons CODE dans abc.testb dans le premier bloc. La table abc.immu possède ce code, mais moins d'enregistrements que le testb pour 1 ou plusieurs valeurs CODE.

À titre d'exemple:

Test Data:

data test; 
do cd='a','b','c'; 
    do i=1 to 10; 
     output; 
    end; 
end; 
run; 

data cds; 
do cd='a','c'; 
    desc=1; 
    output; 
    desc=2; 
    output; 
end; 
run; 

Lorsque nous avons plusieurs enregistrements pour chaque code à la fois test travail que désiré. Ci-dessous génère les mêmes enregistrements.

proc sql noprint; 
create table sql as 
select * from test 
    where cd in (select cd from cds); 
quit; 

data dataStep; 
merge test(in=a) cds(in=b); 
by cd; 
if a and b; 
run; 

Cependant, si nous supprimons le groupe cd="a" à seulement 1 test nous avons un problème:

data test2; 
set test; 
if cd='a' then 
    if i=1; 
run; 

proc sql noprint; 
create table sql2 as 
select * from test2 
    where cd in (select cd from cds); 
quit; 

data dataStep2; 
merge test2(in=a) cds(in=b); 
by cd; 
if a and b; 
run; 

Maintenant, il y a un dossier supplémentaire dans dataStep2.

Pour corriger cela, vous avez quelques options:

  1. Retirez la description colonne de la sélection et l'utilisation d'un mot-clé DISTINCT. Alors testb aura seulement 1 ligne pour chaque CODE.
  2. Utilisez la solution SQL.
+0

J'ai vérifié les codes, le test b a seulement 1 ligne pour chaque code – SAW

+0

sans données et un exemple de travail, nous devons deviner. Comme je l'ai dit, c'était une supposition. Si vous pouvez reproduire le problème avec un exemple, quelqu'un peut expliquer le problème. Voir https://stackoverflow.com/help/mcve – DomPazz