summary-function 構成要素

統計的な要約計算を実行します。

制限事項:要約関数をON句またはWHERE句に記述することはできません。
参照項目:GROUP BY 句
HAVING 句
SELECT 句
table-expression 構成要素
ビューをクエリの結果から作成する
2つのテーブルを結合して新しい値を計算する
SASマクロを使用して欠損値をカウントする

構文

summary-function (<DISTINCT | ALL> sql-expression)

必須引数

summary-function

is one of the following:

AVG | MEAN

算術平均または値の平均

COUNT | FREQ | N

非欠損値の数

CSS

修正平方和

CV

変動係数(パーセント)

MAX

最大値

MEDIAN

中央値。サンプルデータ値を小さい順に並べた場合に、丁度中央に位置する値。

MIN

最小値

NMISS

欠損値の数

PRT

Studentのt統計量Tの両側p値であり、自由度はn - 1. 別の形式を利用するにはイメージをクリックします。です。

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つの引数を指定した場合、その列の値が計算されます。複数の引数を指定した場合、記述した引数(つまり列)が、行ごとに計算されます。

注: SQL集計関数内で複数の引数を使用した場合、その関数はSQL集計(要約)関数とは見なされなくなります。類似する名前のBase SAS関数が存在する場合、PROC SQLは、そのBase SAS関数を実行します。返される結果は、現在の行の値に基づきます。類似する名前のBase SAS関数が存在しない場合、エラーが発生します。たとえば、AVG関数に対して複数の引数を使用した場合、Base SASにはAVG関数が存在しないため、エラー発生します。

例として、次のテーブルに対する計算を考えます。

data summary;
   input X Y Z;
   datalines;
1 3 4
2 4 5
8 9 4
4 5 4
;

Summaryテーブル

Summary Table

関数で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;

要約関数

Summary Table

データの再マージ

SELECT句またはHAVING句で要約関数を使用すると、SASログに次のメッセージが表示されることがあります。

NOTE: The query requires remerging summary
      statistics back with the original
      data.

再マージ処理では、データのパススルーが2回実行されます。最初のパススルーでは、PROC SQLは次を実行します。

  • 要約関数の値を計算して返します。次にその結果を使用して、要約関数が含まれる算術式を計算します。
  • GROUP BY句に従ってデータをグループ化します。

2回目のパススルーでは、PROC SQLは、出力に表示する必要のあるその他の列および行を取得します。

注: データの再マージを使用するクエリをPROC SQLが処理しないように指定するには、PROC SQLのNOREMERGEオプションまたはNOSQLREMERGEシステムオプションのいずれかを使用します。NOREMERGEオプションまたはNOSQLREMERGEシステムオプションを設定した場合、再マージが試みられると、SASログにエラーが書き込まれます。詳細については、REMERGE|NOREMERGEおよびSQLREMERGE システムオプションを参照してください。

次の例では、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;

再マージを必要とする給与情報

給与情報(最初の10行のみ)

ジョブコードごとの平均給与のみを返すように、前述のクエリを変更できます。次のクエリは、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;

再マージが不要なジョブコード情報

Summary Information for Each Jobcode

次のクエリでは、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;
脚注 1:現在、PROC SQLでは、テーブルに対してWEIGHT変数を指定する方法はありません。そのため、各行(またはオブザベーション)の重みは1です。[戻る]
最終更新: 2026年4月14日