2017-01-10 11 views
-1

Я хочу расширить диапазон с помощью запроса DB2 (по iSeries). Например, у меня есть следующие значения в таблицеDB2: как показать все даты в диапазоне

2016-10-01 2016-10-03 600 

Я хочу вывод как

2016-10-01 200 
2016-10-02 200 
2016-10-03 200 

Я пытался, но я не в состоянии разработать запрос. Он должен быть где-то в аналогичных строках, как показано ниже.


Таблица (MYTABLE) имеет две колонки. Ниже снимок

START_DT END_DT  
2016-01-01 2016-01-03 

По этому запросу

with temp1 as         
(            
    SELECT start_dt, end_dt, start_dt as dt  
    FROM mytable         
    UNION          

    SELECT start_dt, end_dt, dt + 1 day as dt 
    FROM temp1         
    WHERE dt < end_dt       
)            
SELECT dt          
FROM temp1  

Я получаю «список столбцов не действителен для таблицы» ошибки.

Я попытался это, а

with temp1 (start_dt, end_dt, dt) as    
(            
    SELECT start_dt, end_dt, start_dt as dt   
    FROM mytable         
    UNION           

    SELECT start_dt, end_dt, dt + 1 day as dt  
    FROM temp1          
    WHERE dt < end_dt        
)             
SELECT dt           
FROM temp1 

Это бросает ошибку «Ключевое слово не допускается рекурсивным выражение TEMP1 общих таблиц.»

+0

Что именно вы пробовали? – mustaccio

+0

@mustaccio Я отредактировал вопрос – uSeruSher

+0

, вы говорите: «У меня есть следующее значение в таблице», но вы не показываете имена столбцов. Невозможно ответить на ваш вопрос. – Hogan

ответ

1

я тест - это работает на 9,7

with table1(start_dt,end_dt, amount) as 
(
    values (timestamp('2017-01-01'), timestamp('2017-01-03'), 600) 

), this_is_not_a_reserved_word (start_dt, end_dt, d, amount) as 
(
    SELECT start_dt, end_dt, start_dt as d, 
     amount/ (timestampdiff(16,end_dt-start_dt)+1) as amount 
    FROM table1 
-- WHERE tab_id_id = 518621  

    UNION ALL 

    SELECT start_dt, end_dt, d + 1 day , amount 
    FROM this_is_not_a_reserved_word 
    WHERE d < end_dt 
) 
SELECT d, amount 
FROM this_is_not_a_reserved_word 

оригинальный ответ

Здесь вы идете:

with this_is_not_a_reserved_word as 
(
    SELECT start_dt, end_dt, start_dt as dt, amount/timestampdiff(16,start_dt-end_dt) as amount 
    FROM table1 
    WHERE tab_id_id = 518621  

    UNION 

    SELECT start_dt, end_dt, dt + 1 day as dt, amount 
    FROM this_is_not_a_reserved_word 
    WHERE dt < end_dt 
) 
SELECT dt, amount 
FROM this_is_not_a_reserved_word 

Если start_dt и end_dt являются дата типа и не используется временная метка:

amount/timestampdiff(16,timestamp(start_dt)-timestamp(end_dt)) as amount 
+0

Спасибо за предоставление этого. Я использую DB2 на iseries. Вышеуказанное не работает. Без предоставления списка столбцов в таблице «Работа» я получаю сообщение об ошибке «Список столбцов недействителен для таблицы» и после предоставления списка столбцов я получаю сообщение об ошибке «Ключевое слово не разрешено в рекурсивном распространенном выражении таблицы WORKING». который я получал с кодом, о котором идет речь. – uSeruSher

+0

так измените случайное имя «работа» на что-то еще, как this_is_not_a_reserved_word – Hogan

+0

Я пробовал это. В моем запросе я использую Temp1 вместо «Working». Ошибка не относится к слову. – uSeruSher

0

попробовать это

with temp1 (start_dt, end_dt, DateCalc, num) as        
(            
    SELECT start_dt, end_dt, start_dt, 0 
    FROM yourtable         
    UNION all         
    SELECT start_dt, end_dt, DateCalc+ 1 day, num +1 
    FROM temp1         
    WHERE DateCalc < end_dt       
)            
SELECT DateCalc          
FROM temp1 

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

  • Нет связанных вопросов^_^