2014-06-10 194 views
1

我需要对两个数据集中的变量进行求和并将其加入。我想在一个SQL语句中执行此操作,但它是一对多连接。我有兴趣了解是否可以使用SELECT语句创建摘要变量,因为缺少更好的描述。使用Proc创建汇总变量SQL

下面的代码错误地计算了HOURS的摘要变量,因为INTERVAL中每个名称/日期只有一条记录,但详细信息中每个名称/日期有多个记录。

我当然可以编写多个步骤来完成这个任务,但是想看看它是否可以在一个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

罗伯特的解决方案工作正常,但是从条款移动子查询时将改为在选择使用它们的,我得到更好更流畅。在两个查询中使用时,只执行一次结果,而选择中的子查询将为每行执行一次。

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 ...更容易阅读,表现更好。 –