2014-06-11 26 views
0

對於報告我正在查資料,我有這個疑問在這裏:開始從一週從輸入日期顯示爲列

select 
gam.bank_id, 
gam.sol_id, 
gam.acct_crncy_code Account_Currency, 
gam.gl_sub_head_code GLSH_Code, 
gam.foracid, 
(select tran_date_bal from tbaadm.eab 
    where eab.eod_date = (select max(eab.eod_date) from tbaadm.eab 
     where gam.acid = eab.acid 
      and eab.eod_date <= '3-Jun-2013') 
    and gam.acid = eab.acid 
    and gam.bank_id = eab.bank_id) balance_1, 

它得到一個帳戶的結束日結餘取決於輸入的結束日期。接下來我需要做的是顯示賬戶的EOD餘額整整一週(在這種情況下,自2013年6月3日起是我的輸入日期,我還需要在6月2日之前顯示賬戶的EOD餘額, 6月1日...截至5月28日)。我還需要將它們顯示爲結果集中的列。到目前爲止,我所做的是這樣的:

(select tran_date_bal from tbaadm.eab 
    where eab.eod_date = (select max(eab.eod_date) from tbaadm.eab 
     where gam.acid = eab.acid 
      and eab.eod_date <= to_date('3-Jun-2013') - 1) 
    and gam.acid = eab.acid 
    and gam.bank_id = eab.bank_id) balance_2, 
(select tran_date_bal from tbaadm.eab 
    where eab.eod_date = (select max(eab.eod_date) from tbaadm.eab 
     where gam.acid = eab.acid 
      and eab.eod_date <= to_date('3-Jun-2013') - 2) 
    and gam.acid = eab.acid 
    and gam.bank_id = eab.bank_id) balance_3 
. 
. 
. 
(select tran_date_bal from tbaadm.eab 
    where eab.eod_date = (select max(eab.eod_date) from tbaadm.eab 
     where gam.acid = eab.acid 
      and eab.eod_date <= to_date('3-Jun-2013') - 6) 
    and gam.acid = eab.acid 
    and gam.bank_id = eab.bank_id) balance_7 

正如你所看到的,是的,我非常硬編碼的該死的東西。事情是,當我越來越多地澄清報告的規格時,我需要添加更多列,這些列還會查看日期的哪幾天(2013年6月3日是星期一,6月2日是星期日...... 5月28日是週二)以及這些日期的相應匯率。當然,按照這個速度,對這些事情進行硬編碼只會使查詢過於臃腫,並且在將來可能還會有其他數據,我必須從輸入日期前一整週開始提取。

我現在的問題是,如果在Oracle中有另一種更高效的方式來執行此操作,其中查詢查找從一週開始直到給定日期的數據,並且數據將顯示爲查詢中的列。

回答

0

不幸的是,我們在我公司的報告中也做了同樣的事情,因爲您的子查詢在您的子查詢中使用gam.acid = eab.acid和gam.acid,我假設「gam」是一個駕駛表或一個然後你必須爲每個gam.acid運行這個迭代,有時我們用這種方式編寫我們的報告,有時候我們對每個標準使用左連接,而不是在我們的select中使用子查詢聲明,取決於開發人員的偏好,但都返回相同的東西,相同的性能。

相關問題