Sas Proc sql-主查询中子查询的按聚合函数分组

Sas Proc sql-主查询中子查询的按聚合函数分组,sas,enterprise-guide,Sas,Enterprise Guide,我创建了两个包含数百万行的数据集。表1包含两个不同的ID号,ID1和ID2。它还包含一个变量,解释某个ID属于哪个组(变量y1) 第二个表(表2)包含来自第一个表和另一个表的两个变量 我想将这两个表连接在一起,但在连接之前,我希望表1只包含按ID1分组的信息,并为它提供ID属于哪个组的信息 我可以在两个Proc Sql阶段中完成这项工作,首先在表1上创建一个表,在表1中我按ID1分组,然后创建另一个步骤,在表2中合并它。然而,这是相当低效的,因为我的表包含太多的行,因此我希望在一次运行中完成。因

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

第二个表(表2)包含来自第一个表和另一个表的两个变量

我想将这两个表连接在一起,但在连接之前,我希望表1只包含按ID1分组的信息,并为它提供ID属于哪个组的信息

我可以在两个Proc Sql阶段中完成这项工作,首先在表1上创建一个表,在表1中我按ID1分组,然后创建另一个步骤,在表2中合并它。然而,这是相当低效的,因为我的表包含太多的行,因此我希望在一次运行中完成。因此,我创建了一个子查询来实现我想要的功能。我的问题是,我得到了一个错误,我不能通过子查询中的变量“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中的一个bug

查询不起作用的全部原因似乎是,如果group by语句是以数字形式给出的,而不是显式地说明要按其分组的变量名,则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;

-回答我自己的问题-

我不知道为什么会发生这种情况,但我遇到了一个非常有趣的现象,可能是SAS中的一个bug

查询不起作用的全部原因似乎是,如果group by语句是以数字形式给出的,而不是显式地说明要按其分组的变量名,则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;