2014-03-03 76 views
0

我有一張查找包含eff_dte = WK_BCC_DATES的行的表。 WK_BCC_DATES是一個在PL1程序中計算的變量,現在我需要在一個查詢中完成這個計算,所以QMF將執行計算。計算是WK_BCC_DATES = DTE1 + NO_DAYS。在DB2中添加迄今爲止的天數

SELECT SUBSTR(PARM_VALUE,1,10)     
FROM BCD75DBA.BCCA6000 T60      
WHERE T60.COUNTRY_CODE   = '896'  
AND T60.SUBSIDIARY_CODE  = '01'   
AND T60.PARM_NAME    = 'BCC_DATES' 
AND T60.EFF_DTE = (SELECT MAX(T60A.EFF_DTE)    
        FROM BCD75DBA.BCCA6000 T60A   
        WHERE T60A.COUNTRY_CODE = '896'  
        AND T60A.SUBSIDIARY_CODE = '01'  
        AND T60A.PARM_NAME = 'BCC_DATES')` 

SELECT SUBSTR(PARM_VALUE,1,3)     
FROM BCD75DBA.BCCA6000 T60      
WHERE T60.COUNTRY_CODE   = '896'  
AND T60.SUBSIDIARY_CODE  = '01'   
AND T60.PARM_NAME    = 'BCC_DAYS' 
AND T60.EFF_DTE = (SELECT MAX(T60A.EFF_DTE)     
        FROM BCD75DBA.BCCA6000 T60A   
        WHERE T60A.COUNTRY_CODE = '896'  
        AND T60A.SUBSIDIARY_CODE = '01'  
        AND T60A.PARM_NAME = 'BCC_DAYS')` 

我試過分組AS DTE1第一查詢,然後第二AS NO_DAYS,但我有一個錯誤「在使用它的上下文中無效」。

請告訴我還能做些什麼。我正在使用DB2 v9。謝謝。

+0

您應該選擇頂部權限的幫助,然後參加快速導覽並使用幫助中心。答案是答案。問題是問題(每個問題有一個問題,而不是滾動「現在我有這個問題」)和評論是關於問題和具體答案的意見,澄清和問題。 –

+0

'WITH Most_Recent_Rows AS(SELECT parm_name,parm_value,ROW_NUMBER()OVER(PARTITION BY PARMONATE ORDER BY eff_dte DESC)AS rn FROM BCD75DBA.BCCA6000 WHERE country_code ='896'AND subsidiary_code ='01'AND parm_name IN('BCC_DAYS', (BCC_dates.parm_value,1,3)AS DATE)+ CAST(SUBSTR ='BCC_DATES'AND bcc_dates.rn = 1 WHERE bcc_days.parm_name ='BCC_DAYS'and bcc_days.rn = 1'我做了這個查詢,沒有錯誤,我 – reignreign

+0

這應該是你的問題的編輯(或一個額外的評論到我的回答)。你能提供樣本數據和表格創建腳本嗎? –

回答

0

那麼,你想結合這些查詢?這其實很簡單。在沒有組合查詢的情況下,很難分辨出導致錯誤的原因,但是您可能會將別名置於不合適的位置。
(供將來參考你的表似乎是一些對於EAV的 - 實體屬性值中使用的是爲未來查詢的搜索詞。)

我覺得有輕微重寫將幫助你在這裏:

WITH Most_Recent_Rows AS (SELECT parm_name, parm_value, 
           ROW_NUMBER() OVER(PARTITION BY parm_name 
                ORDER BY eff_dte DESC) AS rn 
          FROM BCD75DBA.BCCA6000 
          WHERE country_code = '896' 
           AND subsidiary_code = '01' 
           AND parm_name IN ('BCC_DAYS', 'BCC_DATES')) 
SELECT CAST(SUBSTR(bcc_dates.parm_value, 1, 10) AS DATE) + 
           CAST(SUBSTR(bcc_days.parm_value, 1, 3) AS INTEGER) DAYS 
FROM Most_Recent_Rows bcc_days 
JOIN Most_Recent_Rows bcc_dates 
    ON bcc_dates.parm_name = 'BCC_DATES' 
     AND bcc_dates.rn = 1 
WHERE bcc_days.parm_name = 'BCC_DAYS' 
     AND bcc_days.rn = 1 

順便說一句,我認爲試圖爲類似如下:

SELECT bcc_days, bcc_dates 
FROM (SELECT SUBSTR(rw.parm_value, 1, 3) AS bcc_days 
     FROM BCD75DBA.BCCA6000 rw 
     JOIN (SELECT country_code, subsidiary_code, parm_name, MAX(eff_date) AS eff_date 
      FROM BCD75DBA.BCCA6000 
      WHERE parm_name = 'BCC_DAYS' 
      GROUP BY country_code, subsidiary_code, parm_name) ref 
     ON ref.country_code = rw.country_code 
      AND ref.subsidiary_code = rw.subsidiary_code 
      AND ref.parm_name = rw.parm_name 
      AND ref.eff_date = rw.eff_date) bcc_days 
CROSS JOIN (SELECT SUBSTR(rw.parm_value, 1, 10) AS bcc_dates 
      FROM BCD75DBA.BCCA6000 rw 
      JOIN (SELECT country_code, subsidiary_code, parm_name, MAX(eff_date) AS eff_date 
        FROM BCD75DBA.BCCA6000 
        WHERE parm_name = 'BCC_DATES' 
        GROUP BY country_code, subsidiary_code, parm_name) ref 
       ON ref.country_code = rw.country_code 
       AND ref.subsidiary_code = rw.subsidiary_code 
       AND ref.parm_name = rw.parm_name 
       AND ref.eff_date = rw.eff_date) bcc_dates 

由於在子子查詢中的重新填充,這是不太理想的。這可以與答案的前一部分結合使用(使用CTE作爲GROUP BY,然後連接兩次)。我不確定哪種方法實際上會產生更好的性能。

由於缺少樣本數據和期望的結果,兩個查詢都沒有經過測試,事實上我目前沒有實例。

+0

實際上所述第一查詢: 'SELECT SUBSTR(PARM_VALUE,1,10) FROM BCD75DBA.BCCA6000 T60 WHERE T60.COUNTRY_CODE = '896' AND T60.SUBSIDIARY_CODE = '01' AND T60.PARM_NAME = 'BCC_DATES' AND T60.EFF_DTE =(SELECT MAX(T60A.EFF_DTE) FROM BCD75DBA.BCCA6000 T60A 其中T60A。COUNTRY_CODE ='896' AND T60A.SUBSIDIARY_CODE ='01' AND T60A.PARM_NAME ='BCC_DATES')' 將給出'2014-01-01' – reignreign

+0

這樣的日期,第二個會給出'300'代表天..基本上我想要做的是添加'300'天到'2014-01-01' – reignreign

+0

嗨,第一個查詢你已經工作。現在我需要添加這兩個值。 BCC_DAYS BCC_DATES -------- ---------- 300 2013年2月10日 – reignreign