我们有一组值来填充条形图。对于此应用程序,我们将始终需要5年的数据,即使值为null。
,我们将始终需要5行数据。请参阅此查询。假设日期列是从2017年,2016年,2015年进行的..........即使我们也没有2014年的数据&2013年,我将需要返回2014年&2013年,以零为另一列.....
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个行,最多5个....
。预先感谢
尝试使用常见的表表达式/子查询分解每年值的行生成行。使用RIGHT JOIN
为任何缺失的行生成NULL
s。通常我会使用LEFT JOIN
。但是在这种情况下,我认为这种方式读取更好。使用NVL
代替year
代替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小提琴示例