2017-03-10 1 views
0

Je travaille dans SAS Enterprise Guide et je exécution d'une requête de proc sql comme suit:Comment créer une ligne de sortie si un « groupe par » proc sql groupe n'a pas aucune observation

proc sql; 
    CREATE TABLE average_apples AS 
    SELECT farm, size, type, mean(apples) as average_apples 
    FROM input_table 
    GROUP BY farm, size, type 
    ; 
quit; 

Pour certains des ensembles de données J'exécute cette requête il y a des groupes qui n'ont pas d'observations qui leur sont assignées, donc il n'y a pas d'entrée pour eux dans la sortie de la requête.

Comment puis-je forcer cette requête pour renvoyer une ligne pour chacun de mes groupes (par exemple, avec une valeur de 0 dans le

+0

Il sera plus facile de répondre si vous fournissez des exemples de données source. Il semble que vous ayez un ensemble de données qui stocke la valeur de fruits (par exemple pommes) dans des colonnes séparées plutôt que d'avoir une colonne qui identifie le fruit et une colonne de valeur séparée (qui est une structure plus normale). Voulez-vous dire que pour certains ensembles de données, la colonne référencée dans la requête n'existe pas? – Longfish

+1

Avez-vous un jeu de données contenant tous les groupes (c'est-à-dire toutes les combinaisons de type de taille de batterie) que vous souhaitez obtenir dans la sortie? Si c'est le cas, vous pouvez le joindre à votre table de sortie. – Quentin

Répondre

0
Merci à l'avance colonne apples?

pour l'aide!

I'D Pour ce faire,:

/* sample input table */ 
data input_table; 
length farm size type $3 apples 8; 
stop; /* try also with this statement commented out 
     to check the result for non-empty input table */ 
run; 

proc sql; 
    CREATE TABLE average_apples AS 
    SELECT farm, size, type, mean(apples) as average_apples 
    FROM input_table 
    GROUP BY farm, size, type 
    ; 
quit; 

%let group_rows = &SQLOBS; 
%put &group_rows; 

data average_apples_blank; 
if &group_rows ne 0 then set average_apples(obs=0); 
else do; 
    array zeros {*} _numeric_ /* or your list of variables */; 
    do i=1 to dim(zeros); 
     zeros[i] = 0; 
    end; 
    output; /* empty row */ 
end; 
drop i; 
run; 


proc append base=average_apples data=average_apples_blank force; 
run; 
0

Essayez cette

proc sql; 
select f.farm, s.size, t.type, coalesce(mean(apples), 0) as average_apples 
from (select distinct farm from input_table) as f 
    , (select distinct size from input_table) as s 
    , (select distinct type from input_table) as t 
left join input_table as i 
    on i.farm = f.farm and i.size = s.size and i.type t.type; 
quit; 

Je ne l'ai pas testé, cependant. Ça ne marche pas, mettez cela dans un commentaire et je vais le déboguer.

+0

Salut Dirk. Quand j'exécute ceci, j'obtiens l'erreur suivante: ERREUR: la référence corrélée à la batterie de colonnes n'est pas contenue dans la sous-requête. – MRR