我是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;
有两个错误:
错误在线
SELECT a.(*), MIN(b.ValueDate)
答案 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;