首页 > 解决方案 > oracle查询根据日期过滤器获取添加、更新和删除记录的计数

问题描述

我有一个如下表结构

ID OLDID col1 status 
1  0     txt1 A      - inserted record      
2  0     txt1 I      - deleted record
3  0     txt1 I      - updated record
4  3     txt1 I      - updated record
5  4     txt1 I      - updated record
6  5     txt1 I      - deleted record
7  0     txtx I      - updated record
8  7     txt1 A      - updated record

我想统计这张表中插入、更新和删除的记录,请帮我用oracle查询来获取记录的数量,下面是逻辑

  1. 新记录的逻辑是 ID 为新 ID,旧 ID 为 0,状态为 A。
  2. 更新记录的状态为 I,这条记录的 id 将插入到新记录的旧 id 列中。
  3. 旧 id 为 0 的已删除记录状态,第二个条件是状态为 I 并且 ID 不会在 OLD id 列中。

我已尽力解释此案,如果需要更多详细信息,请告诉我。帮助我进行oracle查询。

下面的查询似乎正在工作,但如果没有删除的记录,那么我想为它设置 0 但在下面的查询中只返回具有 >0 个计数的记录,请任何专家对其进行优化

SELECT sub.status, COUNT(*)
FROM (SELECT CASE 
               WHEN yt.oldid = 0 AND yt.status = 'A' THEN 'Insert'
               WHEN yt.status = 'I' and QID not in (select oldid from FROM your_table where TO_CHAR (record_date,'MM/YYYY')='04/2020' )  THEN 'Delete'
               ELSE 'Update' END AS status
      FROM your_table yt where TO_CHAR (record_date,'MM/YYYY')='04/2020')
GROUP BY sub.status;

求高手帮忙看看。

标签: sqloracle

解决方案


您可以使用CASE..WHEN和 selfLEFT JOIN如下:

SELECT T.*,
       CASE WHEN T.OLDID = 0 AND T.STATUS = 'A' THEN 'Insert'
            WHEN T.STATUS = 'I' AND T1.ID IS NOT NULL THEN 'Update'
            WHEN T.STATUS = 'I' AND T.OLDID = 0 AND T1.ID IS NULL THEN 'Delete'
        END AS RECORD_OP
FROM YOUR_TABLE T
LEFT JOIN YOUR_TABLE T1 ON T.ID = T1.OLDID

推荐阅读