如何按月分解数据并在没有数据的情况下显示零个月?

时间:2017-02-23 23:48:48

标签: oracle oracle11g

使用表A中的信息,如何在下面的表B中生成结果?

表A:


CASE_ID     DATE_EFF      COPAY   STATUS
      1     11/04/2016    10      A
      1     11/20/2016    5       A
      1     11/23/2016    5       R
      1     12/01/2016    1       A
      1     12/10/2016    2       A
      1     12/12/2016    10      A
      1     12/31/2016    50      R

对于上述CASE_ID,我们的日期仅在2016年11月和2016年12月,但是,我想生成此CASE_ID的细分,为期6个月,如下所示,每个月的自付额总和(如果适用) DATE_EFF以及不在上述日期范围内的月份,输入零。此外,只有状态为' A'总计任何一个月 - 所以那些地位为' R'在求和中被忽略。例如,根据上表A中的数据,预期结果如下:

表B:


CASE_ID  MONTH     TOTAL_COPAY
1        01/2017   0
1        12/2016   13
1        11/2016   15
1        10/2016   0
1        09/2016   0
1        08/2016   0

我在下面作为一个可能的解决方案[使用with子句],但是这可以在不使用''的情况下实现。条款吗

可能的解决方案:

WITH
XRF AS
( SELECT CASE_ID, COPAY, DATE_EFF
    FROM Table_A WHERE STATUS = 'A'
)
SELECT F.CASE_ID, ST, NVL(SUM(F.COPAY),0) TOTAL_COPAY FROM XRF F PARTITION BY (F.CASE_ID)
            RIGHT OUTER JOIN (SELECT '12/2016' ST FROM DUAL UNION ALL
                    SELECT '11/2016' FROM DUAL UNION ALL
                                                  SELECT '10/2016' FROM DUAL UNION ALL
                                                  SELECT '09/2016' FROM DUAL UNION ALL
                                                  SELECT '08/2016' FROM DUAL UNION ALL
                                                  SELECT '07/2016' FROM DUAL) STS
                                                  ON (TO_CHAR(LAST_DAY((F.DATE_EFF)),'MM/YYYY') = STS.ST)
GROUP BY F.CASE_ID, ST ORDER BY F.CASE_ID, ST DESC
;

更新和解决方案: 使用上面的查询,我相信我已经通过如下实现回答了我自己的问题 - 不确定当你有数百万条这样的CASE_ID记录时使用这种方法是否昂贵。有什么想法吗?

SELECT F.CASE_ID, ST, NVL(SUM(F.COPAY),0) TOTAL_COPAY FROM (SELECT CASE_ID, COPAY, DATE_EFF FROM TABLE_A WHERE STATUS = 'A') F PARTITION BY (F.CASE_ID)
            RIGHT OUTER JOIN (SELECT '12/2016' ST FROM DUAL UNION ALL
                    SELECT '11/2016' FROM DUAL UNION ALL
                                                  SELECT '10/2016' FROM DUAL UNION ALL
                                                  SELECT '09/2016' FROM DUAL UNION ALL
                                                  SELECT '08/2016' FROM DUAL UNION ALL
                                                  SELECT '07/2016' FROM DUAL) STS
                                                  ON (TO_CHAR(LAST_DAY((F.DATE_EFF)),'MM/YYYY') = STS.ST)
GROUP BY F.CASE_ID, ST ORDER BY F.CASE_ID, ST DESC
;

0 个答案:

没有答案