2015-05-18 7 views
1

Мне нужен запрос, который возвращает данные в зависимости от того, какой месяц/год он есть. Ниже подзапрос я написал, который возвращает одну строку - start_date и end_date являются значения мне нужно использовать в моем главном запросеУсловие в выражении WHERE (Oracle)

WITH SUBQ AS (SELECT 
    dim.MONTH_NAME as current_month_name 
    ,dim.year_period as current_month 
    ,dim.PERIOD_YEAR as YEAR 
    ,CASE WHEN dim.year_period NOT LIKE '%01' THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR-1) , '01')) 
     WHEN dim.year_period LIKE '%01'THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR-2) , '01')) 
     END AS START_DATE 
    ,CASE WHEN dim.year_period NOT LIKE '%01' THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR) , '01' )) 
     WHEN dim.year_period LIKE '%01'THEN to_number(CONCAT(to_char(dim.PERIOD_YEAR-1) , '01' )) END AS ENDDATE 
    from dim_periods dim WHERE dim.year_period=to_number(to_char(sysdate, 'YYYYMM'))) 

вопрос - как я могу использовать значения из подзапроса с одной строки в том, где статей? мне нужно, чтобы получить что-то вроде этого, я просто не понимаю, как я должен присоединиться к моему подзапросу и остальные таблиц я использую -

select * from financial_data fd 
where fd.year_period BETWEEN subq.start_date and subq.enddate 

ответ

0

Вы можете присоединиться к подзапросу, т.е. КТРА с таблицу, а затем используйте имя столбца в префиксе фильтра . Результат подзапроса в поле WITH действует как временная таблица .

Например,

WITH SUBQ AS 
    (SELECT dim.MONTH_NAME AS current_month_name , 
    dim.year_period  AS current_month , 
    dim.PERIOD_YEAR  AS YEAR , 
    CASE 
     WHEN dim.year_period NOT LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01')) 
     WHEN dim.year_period LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-2) , '01')) 
    END AS START_DATE , 
    CASE 
     WHEN dim.year_period NOT LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR) , '01')) 
     WHEN dim.year_period LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01')) 
    END AS ENDDATE 
    FROM dim_periods dim 
    WHERE dim.year_period=to_number(TO_CHAR(SYSDATE, 'YYYYMM')) 
) 
SELECT fd.COLUMNS, 
    q.COLUMNS 
FROM financial_data fd 
JOIN subq q 
ON (fd.KEY = q.KEY) -- join key 
WHERE fd.year_period BETWEEN q.start_date AND q.enddate; 

Итак, SUBQ действует как временная таблица, которую вы присоединитесь с financial_data столом.

UPDATE OP не хочет ANSI синтаксис объединения.

WITH SUBQ AS 
    (SELECT dim.MONTH_NAME AS current_month_name , 
    dim.year_period  AS current_month , 
    dim.PERIOD_YEAR  AS YEAR , 
    CASE 
     WHEN dim.year_period NOT LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01')) 
     WHEN dim.year_period LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-2) , '01')) 
    END AS START_DATE , 
    CASE 
     WHEN dim.year_period NOT LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR) , '01')) 
     WHEN dim.year_period LIKE '%01' 
     THEN to_number(CONCAT(TO_CHAR(dim.PERIOD_YEAR-1) , '01')) 
    END AS ENDDATE 
    FROM dim_periods dim 
    WHERE dim.year_period=to_number(TO_CHAR(SYSDATE, 'YYYYMM')) 
) 
SELECT fd.COLUMNS, 
    q.COLUMNS 
FROM financial_data fd, 
    subq q 
WHERE fd.KEY = q.KEY -- join key 
AND fd.year_period BETWEEN q.start_date AND q.enddate; 
+0

Хорошо, но как мне это сделать с присоединением к предложению WHERE? Потому что, если я пытаюсь сделать следующее: fd.year_period = subq2.current_month И fd.year_period между subq2.start_date и subq2.enddate я не получаю все строки, возвращаемые я просто не понимаю, почему – user3014914

+0

@ user3014914 я предоставил вам синтаксис ANSI. См. Мое обновление для эквивалентного синтаксиса Oracle. –

Смежные вопросы