一律返回X行数

时间:2019-02-27 22:09:59

标签: oracle null rows

我们有一组用于填充条形图的值。对于此应用程序,我们将始终需要5年的数据,即使值是NULL,我们也将始终需要5行数据。

请参阅此查询。假设DATE列来自2017年,2016年,2015年.........即使我们可能没有2014年和2013年的数据,我也需要返回2014年和2013年,而其他则为NULL列.....

SELECT period_date, actual_eps
  FROM (SELECT LAST_DAY(TO_DATE(TO_CHAR(period_date),'YYYYMM')) period_date, actual_eps
        FROM period_data
        WHERE ticker = 'ADRO'
          AND period_type = 'A'
          AND actual_eps IS NOT NULL
        ORDER BY period_date DESC NULLS LAST)
  WHERE rownum <= 5;

因此,它将返回它具有的行(最多5行),其他不存在的行(最多5行)返回NULL。

预先感谢

1 个答案:

答案 0 :(得分:1)

尝试使用Common Table Expression/Subquery Factoring为每年的值生成行。使用RIGHT JOIN为所有丢失的行生成NULL。 通常我会使用LEFT JOIN。但是在这种情况下,我认为这种方式会更好。 使用NVLyear替换为NULL period_date值。

with years as
(
    select to_char(sysdate, 'YYYY') as year from dual
    UNION ALL
    select to_char(add_months(sysdate,-12), 'YYYY') as year from dual
    UNION ALL
    select to_char(add_months(sysdate,-24), 'YYYY') as year from dual
    UNION ALL
    select to_char(add_months(sysdate,-36), 'YYYY') as year from dual
    UNION ALL
    select to_char(add_months(sysdate,-48), 'YYYY') as year from dual
)
SELECT
NVL(TO_CHAR(LAST_DAY(pd.period_date),'YYYYMM'),y.year) as period_date,
pd.actual_eps
FROM period_data pd
RIGHT JOIN years y ON y.year = to_char(pd.period_date,'YYYY')
                  AND pd.ticker = 'ADRO'
                  AND pd.period_type = 'A'
                  AND pd.actual_eps IS NOT NULL
WHERE rownum <= 5
ORDER BY period_date desc, actual_eps nulls last;

输出:

| PERIOD_DATE | ACTUAL_EPS |
|-------------|------------|
|      201902 |        foo |
|      201802 |        foo |
|      201702 |        foo |
|        2016 |     (null) |
|        2015 |     (null) |

SQL Fiddle example