1

我需要为已发送和已接收交易的报告编写查询。

Status_Id      Status_dt       Status
1               4/1/2013       sent
1               4/1/2013       sent
2               4/2/2013       sent
3               4/3/2013       sent
1               4/1/2013       Received
1               4/4/2013       Received  
2               4/4/2013       received

在特定日期发送的交易可以在任何日期接收。

从上面

2013 年 4 月 1 日发送的交易有两个(对于 id 1),对于这个 id,wch 在 2013 年 4 月 1 日发送,在 2013 年 4 月 1 日和 2013 年 4 月 4 日收到

所以 o/p 应该是

dt              sent_count          received_count
4/1/2013          2                       2

在 2013 年 4 月 2 日发送的交易是一个(对于 id 2),对于这个 id,wch 在 2013 年 4 月 2 日发送,在 2013 年 4 月 4 日收到

所以 o/p 应该是

dt              sent_count          received_count
4/2/2013          1                       1

2013 年 4 月 3 日发送的交易是一个(对于 id 3),对于这个 id,wch 于 2013 年 4 月 3 日发送尚未收到

所以 o/p 应该是

dt              sent_count          received_count
4/3/2013          1                       0

因此,如果我在 2013 年 4 月 5 日运行查询,输出应该是:::

dt              sent_count          received_count
4/1/2013          2                       2 
4/2/2013          1                       1 
4/3/2013          1                       0

对于发送计数,我可以将查询写为:

select status_dt, count(*)
from table
where status = 'sent'
group by status_dt

我应该为收到的计数写什么查询?

4

2 回答 2

2

对于收到的,您需要加入回发送以获取日期。如果状态 ID 是唯一的,这将是查询:

select t.status_dt, count(*)
from table t join
     table tres
     on t.status_id = tres.status_id and
        t.status = 'sent' and
        tres.status = 'received'
group by status_dt;

相反,一种方法是分配一个唯一的 id:

select t.status_dt, count(*) as SentCount, count(tres.status_id) as ReceivedCount
from (select t.*,
             row_number() over (partition by status_id order by status_dt) as seqnum
      from table t
      where tres.status = 'sent'
     ) t join
     (select tres.*,
             row_number() over (partition by status_id order by status_dt) as seqnum
      from table tres
      where tres.status = 'received'
     ) tres
     on t.status_id = tres.status_id and
        t.seqnum = tres.seqnum
group by status_dt;

这个唯一的 idstatus_id根据记录中的日期(分别用于发送和接收)枚举具有给定的所有内容。这是可行的,因为收到的总是在发送之后。因此,第 n 次接收总是在第 n 次发送之后。

如果您希望在一个查询中同时包含 SentCount 和 ReceivedCount:

select t.status_dt, count(*) as SentCount, count(tres.status_id) as ReceivedCount
from (select t.*,
             row_number() over (partition by status_id order by status_dt) as seqnum
      from table t
      where tres.status = 'sent'
     ) t left outer join
     (select tres.*,
             row_number() over (partition by status_id order by status_dt) as seqnum
      from table tres
      where tres.status = 'received'
     ) tres
     on t.status_id = tres.status_id and
        t.seqnum = tres.seqnum
group by status_dt;
于 2013-05-30T01:58:23.037 回答
0

尝试这个,

select t1.Status_dt, 
       (select count(t2.Status) from table t2 where t2.Status='sent' and t1.Status_dt = t2.Status_dt) as sent_count,
       (select count(t2.Status) from table t2 where t2.Status='received' and t1.Status_dt = t2.Status_dt) as received_count
    from table t1 group by t1.Sattus_dt
于 2013-05-30T03:42:21.023 回答