1

2 つのデータ セットの変数を合計して結合する必要があります。これを 1 つの SQL ステートメントで実行したいのですが、これは 1 対多の結合です。SELECT ステートメントを使用して、より適切な説明がないため、サマリー変数を作成できるかどうかを知りたいと思っています。

次のコードは、INTERVAL では名前/日付ごとに 1 つのレコードしかないのに対し、DETAIL では名前/日付ごとに複数のレコードがあるため、HOURS の集計変数を誤って計算します。

確かに、これを達成するために複数のステップを書くことができましたが、1 つの SQL ステップで達成できるかどうかを確認したかったのです。ありがとう

サンプルコード:

data Detail;
 Length Name CallType $25;
 input date mmddyy10. name $ calltype $ count;
 Format date mmddyy10.;
 datalines;
05/01/2014 John Order 5
05/01/2014 John Complaint 6
05/01/2014 Mary Order 7
05/01/2014 Mary Complaint 8
05/01/2014 Joe Order 4
05/01/2014 Joe Complaint 2
05/01/2014 Joe Internal 2
05/02/2014 John Order 6
05/02/2014 John Complaint 4
05/02/2014 Mary Order 9
05/02/2014 Mary Complaint 7
05/02/2014 Joe Order 3
05/02/2014 Joe Complaint 1
05/02/2014 Joe Internal 3
;

data Interval;
 Length Name $25;
 input date mmddyy10. name $ hours;
 Format date mmddyy10.;
 datalines;
05/01/2014 John 8
05/01/2014 Mary 6
05/01/2014 Joe 4
05/02/2014 John 8
05/02/2014 Mary 6
05/02/2014 Joe 4
;

PROC SQL noprint feedback;
 CREATE TABLE SUMMARY AS
 SELECT
  D.Name
  , Sum(D.Count) as Count
  , Sum(I.Hours) as Hours
 FROM Detail D, Interval I
 WHERE D.Name=I.Name and D.Date=I.Date
 GROUP BY D.Name
 ORDER BY D.Name;
QUIT;
4

2 に答える 2

2

これは機能し、非効率的であってはなりません。個人的には、マージする前に両方を個別に要約するのが最善の方法だと思います。

PROC SQL noprint feedback;
 CREATE TABLE SUMMARY AS
 SELECT
  D.Name
  , Sum(D.Count) as Count
  , (SELECT sum(I.Hours) as Hours from Interval I WHERE D.Name=I.Name GROUP BY i.name) as Hours
 FROM Detail D
 GROUP BY D.Name
 ORDER BY D.Name
 ;
QUIT;
于 2014-06-10T15:55:05.347 に答える