【问题标题】:Proc sql - Group by aggregate function from subquery in main queryProc sql - 按主查询中子查询的聚合函数分组
【发布时间】:2017-03-03 10:33:44
【问题描述】:

我有两个包含数百万行的数据集。表 1 包含两个不同的 ID 号,ID1 和 ID2。它还包含一个变量,解释某个 ID 属于哪个组(变量 y1)。

第二个表 (Table2) 包含来自第一个表的两个变量和一个附加变量。

我想将这两个表连接在一起,但在连接之前,我希望 table1 只包含按 ID1 分组的信息,并且还希望它给我一个 ID 属于哪个组的信息。

我可以在两个 Proc Sql 阶段执行此操作,首先在 table1 上创建一个表,并按 ID1 分组,然后创建另一个步骤,将其合并到 table2。然而,这是相当低效的,因为我的表包含这么多行,因此我想一次性完成。因此,我创建了一个执行我想要的子查询。我的问题是我得到的错误是我无法从子查询中按变量“WhichGroup”分组,因为它源于聚合函数。我想知道我想要实现的目标是否有一些好的解决方法?

提前非常感谢!

示例代码:

data table1;
input ID1 $ ID2 $ x1 2. y1 $;
datalines;
1 p1 10 Group1
1 p2 20 Group2
2 p3 50 Group1
;
run;

data table2;
input ID1 $ x1 x2;
datalines;
1 10 500
1 20 600
2 50 700
;
run;


Proc sql;
    Create table Test
      as select
        t1.WhichGroup
        ,sum(t1.Sum_x1) as Sum_x1
        ,sum(t2.x2) as Sum_x2
          from (select 
                    a.ID1
                    ,case when max(case when a.y1 = 'Group1' then 1 else 0 end) = 0 then 'Group2'
                          when max(case when a.y1 = 'Group2' then 1 else 0 end) = 0 then 'Group1'
                          else 'Both' end as WhichGroup
                    ,Sum(a.x1) as Sum_x1
                  from work.table1  as a
                 group by 1
                ) as t1
            left join 
               work.table2   as t2
        on t1.ID1 = t2.ID1
    Group by 1;
Quit;

【问题讨论】:

    标签: sas enterprise-guide


    【解决方案1】:

    - 回答我自己的问题 -

    我不确定为什么会发生这种情况,但我遇到了一个非常有趣的现象,并且可能是 SAS 中的一个错误。

    查询不起作用的全部原因似乎是因为 SAS 不理解 group by 语句,如果它以数字形式给出,而不是明确说明要分组的变量名称。 SAS 可能会在列顺序中丢失?

    在 SAS 之前有没有其他人遇到过这种现象?

    因此,如果使用以下代码,则查询有效:

    Proc sql;
        Create table Test
          as select
            t1.WhichGroup
            ,sum(t1.Sum_x1) as sum_x1
            ,sum(t2.x2) as Sum_x2
              from (select 
                        a.ID1
                        ,case when max(case when a.y1 = 'Group1' then 1 else 0 end) = 0 then 'Group2'
                              when max(case when a.y1 = 'Group2' then 1 else 0 end) = 0 then 'Group1'
                              else 'Both' end as WhichGroup
                        ,Sum(a.x1) as Sum_x1
                      from work.table1  as a
                     group by 1
                    ) as t1
                left join 
                   work.table2   as t2
            on t1.ID1 = t2.ID1
        Group by WhichGroup;
    Quit;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多