summary-function 構成要素
統計的な要約計算を実行します。
| 制限事項: | 要約関数をON句またはWHERE句に記述することはできません。 |
|---|---|
| 参照項目: | GROUP BY 句 |
| HAVING 句 | |
| SELECT 句 | |
| table-expression 構成要素 | |
| 例: | ビューをクエリの結果から作成する |
| 2つのテーブルを結合して新しい値を計算する | |
| SASマクロを使用して欠損値をカウントする |
構文
必須引数
summary-function
is one of the following:
AVG | MEAN
算術平均または値の平均
COUNT | FREQ | N
非欠損値の数
CSS
修正平方和
CV
変動係数(パーセント)
MAX
最大値
MEDIAN
中央値。サンプルデータ値を小さい順に並べた場合に、丁度中央に位置する値。
MIN
最小値
NMISS
欠損値の数
RANGE
値の範囲
STD
標準偏差
STDERR
平均の標準誤差
SUM
値の合計
SUMWGT
WEIGHT変数値の合計 (脚注 1)
T
母集団の平均値がゼロに等しいという仮説を検定するためのスチューデントのt値
USS
無修正平方和
VAR
分散
これらの統計量の説明と使用される式については、基本的なSAS統計プロシジャ (Base SASプロシジャガイド)を参照してください。
DISTINCT
SQL式の一意の値のみを計算で使用することを指定します。
ALL
SQL式のすべての値を計算で使用することを指定します。DISTINCTとALLのどちらも指定しない場合、ALLが使用されます。
sql-expression
sql-expression 構成要素を参照してください。
詳細
データの要約
要約関数は、FROM句に記述したテーブルまたはビュー全体の統計的要約、あるいはGROUP BY句に指定したグループごとの統計的要約を生成します。GROUP BYを省略した場合、テーブルまたはビュー内のすべての行が1つのグループであると見なされます。これらの関数は、テーブル内の各行または各列のすべての値をまとめ、1つの要約値または集計値を求めます。このため、これらの関数は、多くの場合、集計関数と呼ばれます。たとえば、ある列の合計(1つの値)は、その列のすべての値を加算することによって得られます。
行のカウント
COUNT関数は行をカウントします。COUNT(*)は、グループまたはテーブルに含まれる行の総数を返します。COUNTの引数として列名を使用した場合、グループまたはテーブルに含まれ、その列が非欠損値である行の総数が返されます。列内の一意の値をカウントする場合は、COUNT(DISTINCT column)を指定します。
テーブル式のSELECT句に1つ以上の要約関数が含まれ、そのテーブル式によって行が決定されなかった場合、要約関数の結果は欠損値になります。ゼロを返す例外を次に示します。
- COUNT(*)
- COUNT(<DISTINCT> sql-expression)
- NMISS(<DISTINCT> sql-expression)
例については、ビューをクエリの結果から作成するおよびSASマクロを使用して欠損値をカウントするを参照してください。
引数の数に基づく統計量の計算
要約関数で指定される引数の数は、計算の実行方法に影響します。1つの引数を指定した場合、その列の値が計算されます。複数の引数を指定した場合、記述した引数(つまり列)が、行ごとに計算されます。
例として、次のテーブルに対する計算を考えます。
data summary;
input X Y Z;
datalines;
1 3 4
2 4 5
8 9 4
4 5 4
;
Summaryテーブル

関数で1つの引数を使用した場合、その列に対してのみ計算が実行されます。複数の引数を使用した場合、指定した列の各行に対して計算が実行されます。次のPROC SQLステップでは、MIN関数とMAX関数を使用して、列の最小値と最大値を返しています。SUM関数は、行ごとに、引数で指定した列の合計を返します。
proc sql;
select min(x) as Colmin_x,
min(y) as Colmin_y,
max(z) as Colmax_z,
sum(x,y,z) as Rowsum
from summary;
quit;
要約関数

データの再マージ
SELECT句またはHAVING句で要約関数を使用すると、SASログに次のメッセージが表示されることがあります。
NOTE: The query requires remerging summary
statistics back with the original
data.
再マージ処理では、データのパススルーが2回実行されます。最初のパススルーでは、PROC SQLは次を実行します。
- 要約関数の値を計算して返します。次にその結果を使用して、要約関数が含まれる算術式を計算します。
- GROUP BY句に従ってデータをグループ化します。
2回目のパススルーでは、PROC SQLは、出力に表示する必要のあるその他の列および行を取得します。
次の例では、Payrollテーブルを使用して、データの再マージが必要な場合と不要な場合を示しています。テーブルをクエリの結果から作成するを参照してください。
最初のクエリは、再マージを必要とします。1回目のデータのパススルーによってデータをJobcodeごとにグループ化し、グループごとにAVG関数の値を決定します。しかし、PROC SQLは、IdNumberとSalaryの値を取得するために、2回目のパススルーを実行する必要があります。
proc sql outobs=10;
title1 'Salary Information';
title2 'First 10 Rows Only';
select IdNumber, Jobcode, Salary,
avg(salary) as AvgSalary
from payroll
group by jobcode;
quit;
再マージを必要とする給与情報

ジョブコードごとの平均給与のみを返すように、前述のクエリを変更できます。次のクエリは、1回目のデータのパススルーによって要約とグループ化が実行されるため、再マージを必要としません。そのため、2回目のパススルーは不要です。
proc sql outobs=10;
title1 'Average Salary for Each Jobcode';
title2 'First 10 Rows Only';
select Jobcode, avg(salary) as AvgSalary
from payroll
group by jobcode;
quit;
再マージが不要な給与情報

HAVING句を使用すると、HAVING式を決定するために、PROC SQLでデータの再マージが必要になる場合があります。
まず、HAVING句を使用するが再マージを必要としないクエリを検討します。クエリは、Jobcodeの値でデータをグループ化します。その結果には、Jobcodeの値ごとに1行が含まれ、各Jobcodeについての従業員の要約情報が含まれています。1回目のパススルーでは、要約関数が、Number列、Average
Age列、およびAverage Salary列の値を返します。1回目のパススルーでは、HAVING句を決定するためにPROC SQLが必要とするすべての値が返されます。そのため、再マージは不要です。
proc sql outobs=10;
title1 'Summary Information for Each Jobcode';
title2 'First 10 Rows Only';
select Jobcode,
count(jobcode) as number
label='Number',
avg(int((today()-birth)/365.25))
as avgage format=2.
label='Average Age',
avg(salary) as avgsal format=dollar8.
label='Average Salary'
from payroll
group by jobcode
having avgage ge 30;
quit;
再マージが不要なジョブコード情報

次のクエリでは、PROC SQLによってデータが再マージされています。これは、HAVING句がSALARY列を比較で使用しており、SALARY列がGROUP BY句に含まれていないためです。
proc sql outobs=10;
title1 'Employees who Earn More than the';
title2 'Average for Their Jobcode';
title3 'First 10 Rows Only';
select Jobcode, Salary,
avg(salary) as AvgSalary
from payroll
group by jobcode
having salary > AvgSalary;
quit;
再マージが必要なジョブコード情報

次の場合、PROC SQLがデータを再マージすることに注意してください。
- 要約関数が返す値を、計算で使用する。たとえば、次のクエリは、Xの値と、合計に対するXの割合(パーセンテージ)を行ごとに返します。1回目のパススルーでは、PROC SQLはXの合計を計算し、2回目のパススルーでは、PROC
SQLはXの値ごとに合計に対する割合(パーセンテージ)を計算します。
data summary; input x; datalines; 32 86 49 49 ; proc sql; title 'Percentage of the Total'; select X, (100*x/sum(X)) as Pct_Total from summary; quit;全体に占める割合

- 要約関数が返す値を、GROUP BY句で指定していない列の値と比較します。たとえば、次のクエリでは、Payrollテーブルを使用しています。PROC SQLは、Salary列がGROUP
BY句で指定されていないため、データを再マージします。
proc sql; select jobcode, salary, avg(salary) as avsal from payroll group by jobcode having salary > avsal; quit; - 入力テーブルの列をSELECT句で指定し、GROUP BY句で指定しません。このルールは、SELECT句内の要約関数の引数で使用される列には適用されません。
たとえば、次のクエリでは、SELECT句にIdNumberが存在することにより、PROC SQLはデータを再マージします。これは、IdNumberが、1回目のパススルーの際に、グループ化にも要約にも関係していないためです。PROC SQLがIdNumberの値を取得するには、2回目のデータのパススルーを実行する必要があります。
proc sql; select IdNumber, jobcode, avg(salary) as avsal from payroll group by jobcode; quit;