Sql 如何根据另一个表的条目数更新表
我有如下表格Sql 如何根据另一个表的条目数更新表,sql,sas,Sql,Sas,我有如下表格 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
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
我想根据每个操作相对于源的条目数在最终表中添加数据
我的决赛表格如下
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_逾期是指到期日已过的未结项目总数
此时间的日期为2017年12月9日
请告诉我动态更新我的表,因为我的系统中可能有许多源类型和操作类型
祝您度过愉快的一天。您可以使用条件聚合:
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;
选择源、操作、,
将(*)计算为收到的总金额,
总和(状态为“已关闭”时的情况,然后为1,否则为0结束)作为已关闭的总数,
过期金额(状态为“打开”且DueDate<今天()然后为1或0结束时的情况)
从t
按来源、行动分组;
日期/时间函数因数据库而异。这将使用适用于SAS proc sql的函数。首先,让我们将数据列表转换为数据集,这样我们就有了一个代码示例
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值。因此,您可以对结果求和()以得到一个为真的数字计数。如果要将日期时间值与日期进行比较,则需要转换其中一个。我在下面使用了日期文字,但是如果您想要今天的日期,可以使用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;
proc-sql;
将表格最终创建为
选择
来源
行动
,将(*)计为收到的总数量
,总和(状态为“已关闭”)为已关闭的总额
,金额(状态为“未结”且日期部分(截止日期)<'2017年12月9日)逾期
从样品
按1,2分组
;
退出
Mysql或sql server?我正在使用SAS server,但sql编码可以正常工作“过期”的逻辑对我来说毫无意义。如果duedate小于今天的日期,为什么duedate变量显示的是日期时间值而不是日期值?时间部分可以忽略吗?