我的表格如下
Sample
Source | Action | DueDate | Status
A Act_1 08DEC2017:00:00:00 Open
A Act_1 09DEC2017:00:00:00 closed
A Act_2 09DEC2017:00:00:00 Open
A Act_2 09DEC2017:00:00:00 closed
A Act_3 09DEC2017:00:00:00 Open
B Act_1 09DEC2017:00:00:00 Open
B Act_2 09DEC2017:00:00:00 closed
我想根据每个Action相对于源的条目数在我的最终表中添加数据。
我的最终表格为
final
Source | Action | Total_Received | Total_closed | OverDue
A Act_1 2 1 1
A Act_2 2 1 0
A Act_3 1 0 0
B Act_1 1 0 0
B Act_2 1 1 0
Total_Received是条目/行的总数
Total_Closed是已关闭条目的总数
Total_overdue是传递DueDate的打开条目的总数
这个时间的日期是9DEC2017
请告诉我动态更新我的表,因为我的系统中可能有很多Source类型和Action Type。
度过愉快的一天。
答案 0 :(得分:1)
首先让我们将您的数据列表转换为数据集,以便我们有一个代码示例。
data sample;
input source $ action $ duedate :datetime. status $ ;
format duedate datetime20.;
cards;
A Act_1 08DEC2017:00:00:00 Open
A Act_1 09DEC2017:00:00:00 closed
A Act_2 09DEC2017:00:00:00 Open
A Act_2 09DEC2017:00:00:00 closed
A Act_3 09DEC2017:00:00:00 Open
B Act_1 09DEC2017:00:00:00 Open
B Act_2 09DEC2017:00:00:00 closed
;
在PROC SQL中计算满足条件的记录很容易,因为SAS会将布尔表达式计算为1/0值。因此,您只需SUM()结果即可获得真实数字的计数。如果要将日期时间值与需要转换其中一个的日期进行比较。我在下面使用了日期文字但是如果你想要今天的日期,你可以使用DATE()
函数。
proc sql ;
create table final as
select
source
,action
,count(*) as Total_Received
,sum( status='closed' ) as Total_Closed
,sum( status='Open' and datepart(duedate)< '09DEC2017'd) as OverDue
from sample
group by 1,2
;
quit;
答案 1 :(得分:0)
您可以使用条件聚合执行此操作:
select source, action,
count(*) as total_received,
sum(case when status = 'Closed' then 1 else 0 end) as total_closed,
sum(case when status = 'Open' and DueDate < Today() then 1 else 0 end) as overdue
from t
group by source, action;
日期/时间功能因数据库而异。这使用适用于SAS proc sql的函数。