Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SAS Proc SQL中将多行值连接到一行中_Sql_Sas_Concatenation_Proc Sql - Fatal编程技术网

如何在SAS Proc SQL中将多行值连接到一行中

如何在SAS Proc SQL中将多行值连接到一行中,sql,sas,concatenation,proc-sql,Sql,Sas,Concatenation,Proc Sql,我有下面的数据。我想保留unique make变量,并将有关unique汽车制造商的所有信息连接到一行,如下所示: !!我只想使用procsql来完成所有的工作 期望输出: AMC Concord 22 2012-02-19; Pacer 17 2010-09-14; Spirit 22 2011-08-17 Buick Century 20 2001-12-19; Electra 15 2003-08-02 Cuick Electra 15 2002-10-01; Century 20

我有下面的数据。我想保留unique make变量,并将有关unique汽车制造商的所有信息连接到一行,如下所示:

!!我只想使用procsql来完成所有的工作

期望输出:

AMC Concord 22 2012-02-19; Pacer 17 2010-09-14; Spirit 22 2011-08-17 
Buick Century 20 2001-12-19; Electra 15 2003-08-02  
Cuick Electra 15 2002-10-01; Century 20 2007-05-30; Spirit  22 2004-11-03 
代码:

到目前为止,我尝试的内容如下:

proc sql;
create table test as
    select  distinct make,model, CATX (",", model,mpg) AS var1,
                        CATX (",", CALCULATED var1, put(date,10.)) AS var2,
                        monotonic() as rownum,
                        max(calculated rownum) as max,min(calculated rownum) as min,
    case 
        when calculated rownum=calculated max then 2  
        when calculated rownum=calculated min then 1 
        else 0 
    end as record,

    case
        when calculated record = 1 then CATS (calculated var2) 
        else CATX (",", CATS (calculated var2),calculated var2) 
    end as result

from cars2
group by make
order by rownum;
quit;

procsql
中可能会出现这种情况,但与在datastep中进行相比,效率要低得多,复杂得多。您必须对其进行硬编码并进行多次迭代。您是在SAS中执行此操作还是将其传递到数据库?如果它是一个数据库,您可以使用pass-through-SQL,那么可能会有更好的选择。当我说更好的选择时,我的意思是关于SQL。PROC转置或数据步骤更易于理解和编程。@Joe我不确定仅使用
PROC sql
是否可行。i、 e.SAS的SQL实现。如果没有某种折叠/转置字符值的方法,您将被迫硬编码固定数量的自连接。如果每个“make”有少量记录,这可能会起作用,但如果有数百条记录,我认为这不是一个可行的解决方案。您必须使用固定数量或使用宏工具,尽管您可以在proc sql中完全使用宏工具。
proc sql;
create table test as
    select  distinct make,model, CATX (",", model,mpg) AS var1,
                        CATX (",", CALCULATED var1, put(date,10.)) AS var2,
                        monotonic() as rownum,
                        max(calculated rownum) as max,min(calculated rownum) as min,
    case 
        when calculated rownum=calculated max then 2  
        when calculated rownum=calculated min then 1 
        else 0 
    end as record,

    case
        when calculated record = 1 then CATS (calculated var2) 
        else CATX (",", CATS (calculated var2),calculated var2) 
    end as result

from cars2
group by make
order by rownum;
quit;