Всегда возвращать Х количество строк - PullRequest
0 голосов
/ 28 февраля 2019

У нас есть набор значений, которые мы используем для заполнения гистограммы.Для этого приложения нам всегда нужны данные за 5 лет, нам всегда нужно 5 строк данных, даже если значения равны NULL.

См. Этот запрос.Предположим, что столбец 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, и NULL для других строк, которых у него нет, до 5 .......

Заранее спасибо

1 Ответ

0 голосов
/ 28 февраля 2019

Попробуйте использовать Общее выражение таблицы / Факторинг подзапроса , чтобы сгенерировать строки для каждого значения года.Используйте 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 Fiddle

...