2017-01-10 18 views
-1

DB2(iSeries上)クエリを使用して範囲を拡張したいとします。例えば、私は私がDB2:範囲内のすべての日付を表示するには

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

として出力したいテーブル

2016-10-01 2016-10-03 600 

に次の値を持っている私が試したが、私は、クエリを開発することはできませんよ。それは以下のような類似の行のどこかにあるはずです。


表(MYTABLE)には2つの列があります。以下は、このクエリ

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  

私はエラー「テーブルには有効ではありません列のリスト」を取得しています上のスナップショット

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

です。

は、私はこのようにも

これはエラーを投げている
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はdate型であればタイムスタンプの使用ではありません:

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

これを提供していただきありがとうございます。私はiseriesでDB2を使用しています。上記のdoesntの仕事。 "Working"テーブルに列リストを指定せずに、 "Column list not valid for table"というエラーが表示され、列リストを提供した後、 "再帰的な共通テーブル式WORKINGでキーワードが使用できません"というエラーが表示されます。問題のコードを入手していました。 – uSeruSher

+0

このように他の何かに "働いている"ランダム名を変更してくださいthis_is_not_a_reserved_word – Hogan

+0

私はそれを試みました。私の質問では、 "作業中"の代わりにTemp1を使用します。エラーは単語に固有のものではありません。 – 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 
関連する問題