2017-08-18 5 views
0

J'ai passé plusieurs mois à l'exploration de données et à la création d'une technique pour trouver des informations pour une entreprise. J'ai du mal à mettre les données dans une présentation appropriée et valable sur la façon de résumer l'information dans SAS. J'ai 3 questions.Comment créer ces instructions case dans proc sql et ajouter lorsque les tables sont remplacées?

1) comment puis-je dire dans proc sql "Si matched_by_t2> b2_c2 puis ajouter dans la nouvelle colonne "non bueno"

2) est-il un moyen d'avoir "(BC_C2/original_count)%" Comment pourrais-je insérer ce signe de pourcentage

3) également si j'exécute cette requête plusieurs fois pour une liste d'ensembles de données comment puis-je obtenir ces nouvelles tables nommées "e_data_unmatched" chaque fois qu'une nouvelle table est créée et écrasée imgur Je montre deux lignes chaque fois que le programme s'exécute les tables sont remplacées, donc je veux m'assurer que chaque fois que la boucle s'exécute, les nouveaux enregistrements s'ajoutent à la table plutôt que d'écraser 1http://imgur.com/bzLefXy

Merci beaucoup!

proc sql; 
create table wanted as 
select t1.occurences as original_count 
     ,t2.occurences as matched_by_T1 
     ,t3.occurences as matched_by_T2 
     ,t2.occurences+t3.occurences as B2_C2 
     ,t4.occurences as not_matched 
     ,t5.occurences as matched_by_t2 
from (select count(*) as occurences from query_for_reports1) t1 
    ,(select count(*) as occurences from query_for_reports1 where edsys is not null) t2 
    ,(select count(*) as occurences from e_data_unmatched where ip is not null) t3 
    ,(select count(*) as occurences from WORK.E_DAT_UNMATCHED where IpS= .) t4 
    ,(select count(*) as occurences from work.Append_table13) t5 
; 
quit; 

Répondre

1
1) Add new column "no bueno" in sql set value based on conditiong " If matched_by_t2 > b2_c2" 
2) concatenate percentage sign 
proc sql; 
create table wanted as 
select t1.occurences as original_count 
     ,t2.occurences as matched_by_T1 
     ,t3.occurences as matched_by_T2 
     ,t2.occurences+t3.occurences as B2_C2 
     ,t4.occurences as not_matched 
     ,t5.occurences as matched_by_t2, 
case when t3.occurences> t5.occurences then 0 
else 1 end as no_bueno, 
CAST(((t2.occurences+t3.occurences)/ t1.occurences) as nvarchar(5)) +'%' 
from (select count(*) as occurences from query_for_reports1) t1 
    ,(select count(*) as occurences from query_for_reports1 where edsys is not null) t2 
    ,(select count(*) as occurences from e_data_unmatched where ip is not null) t3 
    ,(select count(*) as occurences from WORK.E_DAT_UNMATCHED where IpS= .) t4 
    ,(select count(*) as occurences from work.Append_table13) t5 
; 
quit; 
+0

Plusieurs choses ne vont pas ici. Pour l'un, votre ligne 'cast' n'est pas une syntaxe SAS valide (pas dans ce proc sql au moins). Deuxièmement, il semble qu'elle souhaite conditionnellement avoir la valeur "no bueno" dans une colonne, pas une colonne appelée "no bueno". Enfin, vous avez ajouté des éléments à son code sans corriger ses erreurs (par exemple, dupliquer les colonnes 'matched_by_t2' dans une instruction select); ce qui signifie que, même si vos ajouts étaient corrects, ce code ne fonctionnerait toujours pas. – user2877959

+0

@ user2877959 Y at-il un moyen de dire que sa réponse était juste pour 50% de ma question? Qu'est-ce que l'étiquette de pile? –

+0

Je dirais que cette réponse était juste pour 33% de votre question en supposant qu'il avait raison de comprendre votre premier point. Je suppose que la philosophie de la pile est que vous avez voté une réponse utile et/ou que vous avez accepté une réponse qui a complètement répondu à votre question. – user2877959

0

Pour construire votre requête et essayer de répondre à trois questions:

1) Si vous voulez une nouvelle colonne contenant la valeur « non bueno » quand la condition est vraie, vous ajoutez la colonne suivante à votre clause select:

case 
    when matched_by_t2>t2.occurences+t3.occurences then "no bueno" 
end as new_column_1 

Si toutefois ce que vous voulez est une valeur de type drapeau dans une colonne appelée pas bueno, vous pouvez utiliser @ suggestion de Trushna

2) Il y a deux façons de le faire. Vous pouvez stocker la valeur comme une variable de caractère avec le signe pour cent définitivement dans ce:

catx(' ',(t2.occurences+t3.occurences)/t1.occurences,'%') as new_column_2 

ou vous pouvez stocker la valeur en tant que variable numérique et affichage avec un signe pour cent en utilisant un format:

(t2.occurences+t3.occurences)/t1.occurences as new_column_2 format=percent. 

3) une façon d'utiliser cette requête pour ajouter sa sortie à une table à chaque fois est d'utiliser une requête insert into au lieu d'un create table:

proc sql; 
insert into wanted 
select [...] 
; 
quit; 

Bare dans l'esprit que la table doit exister pour un insert into pour réussir. Dans votre cas, vous devrez utiliser la syntaxe create table la première fois, puis la insert into syntax chaque fois.

Je dois souligner que, même si je ne suis pas au courant de votre flux de travail ni du contexte dans lequel vous faites cela, la façon dont vous essayez d'y parvenir semble très sous-optimale et vous pourriez envisager de repenser votre processus.