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变量显示的是日期时间值而不是日期值?时间部分可以忽略吗?