我该如何修复我的代码?

时间:2016-02-14 10:15:33

标签: sql-server

我是SQL的新手,我尝试在sql中使用,我在程序中遇到错误,这是我们的代码:

proq sql;

select table sale1 as

SELECT 
    COUNT(*)
FROM 
    (SELECT 
         a.(*), MIN(b.ValueDate)
     FROM 
         CRM1 as a
     LEFT JOIN 
         work.final5 as b ON a.CustomerID = b.CustomerID
                          AND a.CRMEventStartDate = b.ValueDate 
     WHERE 
         b.ATM IS NOT NULL 
     GROUP BY 
         a.CustomerID
     ORDER BY 
         b.ValueDate DESC);

quit;

有两个错误:

  1. 期待以下其中一项:名称。*。
  2. 语句将被忽略
  3. 错误在线

    SELECT a.(*), MIN(b.ValueDate)
    

2 个答案:

答案 0 :(得分:0)

删除2 (个括号,并提供内部查询别名as temp,您的查询应为:

SELECT COUNT(*)

FROM (

SELECT a.*, MIN(b.ValueDate)

FROM CRM1 as a

LEFT JOIN work.final5 as b

ON a.CustomerID = b.CustomerID

AND a.CRMEventStartDate = b.ValueDate 

WHERE b.ATM IS NOT NULL 

GROUP BY a.CustomerID

ORDER BY b.ValueDate DESC) as temp;

quit;

答案 1 :(得分:0)

我假设你使用的是proc sql和work文件夹。我建议如果您从另一个数据库中提取数据,请暂存第一个数据集的结果并使用数据步骤合并结果。如果您只是将查询结果组合在一起,那么使用数据步骤的速度会快得多。

** passthrough的通用语法**

proc sql;
   connect to odbc(datasrc="<<database name>>" QUERY_TIMEOUT=60);
   create table <<table you want to make>> as
   select * from connection to odbc
   (
   <<sql query here>>
   )
   ;
   disconnect from odbc;
quit;

**为您提出的解决方案**

proc sql;
   create table sale1 as
     select
       a.*, min(b.ValueDate)
     from
       crm1 a
         left join work.final5 b on
                a.CustomerID = b.CustomerID
            AND a.CRMEventStartDate = b.ValueDate 
     where
       b.atm is not null
     group by
       a.CustomerID;
quit;

proc sql;
   create table sale1tot as select count(*) from sale1;
quit;

您也可以在SAS中使用MERGE语句,如下所示......

data sale1;
   merge crm1(in=ina)
         work.final5(in=inb rename=(ValueDate=CRMEventStartDate));
   by CustomerID CRMEventStartDate;
   if ina and inb and inb.atm <> '';
run;