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 日に送信されたトランザクションは 2 つ (ID 1 の場合) で、この ID では 2013 年 4 月 1 日に送信され、2013 年 4 月 1 日と 2013 年 4 月 4 日に受信されました。

だからo / pは

dt              sent_count          received_count
4/1/2013          2                       2

2013 年 4 月 2 日に送信されたトランザクションは 1 つ (ID 2 の場合) で、この ID では 2013 年 4 月 2 日に送信され、2013 年 4 月 4 日に受信されました

だからo / pは

dt              sent_count          received_count
4/2/2013          1                       1

2013 年 4 月 3 日に送信されたトランザクションは 1 つ (ID 3 の場合) であり、この ID については 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 番目の送信の後にあります。

1 つのクエリで 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 に答える