2014-06-10 3 views
1

두 데이터 세트의 변수를 합친 다음 합치면됩니다. 하나의 SQL 문에서이 작업을 수행하려고합니다. 그러나 일대 다 조인입니다. SELECT 문을 사용하여 더 나은 설명이 없기 때문에 요약 변수를 만들 수 있는지 배우는 데 관심이 있습니다.Proc SQL을 사용하여 요약 변수 만들기

INTERVAL에 이름/날짜 당 하나의 레코드 만 있기 때문에 아래 코드는 HOURS에 대한 요약 변수를 잘못 계산하지만 DETAIL에 이름/날짜 당 여러 레코드가 있기 때문에 잘못 계산됩니다.

이 작업을 수행하기 위해 여러 단계를 작성할 수 있지만 한 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; 

답변

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; 
+0

감사합니다. 디버깅하기가 쉽기 때문에? 코드가 더 깨끗합니까? 아니면 당신이 더 효율적이라고 생각합니까? –

+0

그래서 외부 FROM 문에서 조인을하지 않습니까? –

+0

GROUP BY 문에 오타가 있습니까? –

2

로버트의 솔루션은 잘 작동하지만 선택에서 그들을 사용하는 대신 절에서에 하위 쿼리를 이동할 때 더 나은 perfomance를 얻을 : 개인적으로 나는 가장 좋은 방법은 모두 독립적으로 이전 통합으로 요약하는 것입니다 생각합니다. from에서 사용 된 경우 두 쿼리는 한 번만 실행되고 결과는 조인됩니다. select의 하위 쿼리는 각 행에 대해 한 번씩 실행됩니다.

proc sql; 
     create table summary as 
     select 
      d.name, 
      count, 
      hours 
     from 
      (select name, sum(count) as count from detail group by name) d inner join 
      (select name, sum(hours) as hours from interval group by name) i 
      on d.name = i.name 
     order by d.name 
    ; 
    quit; 
+0

네, 솔루션을 더 좋아합니다. Laurent ... 읽기가 쉽고 성능이 좋습니다. –

관련 문제