从输入日期开始,从一周开始查找数据并显示为列

时间:2014-06-11 08:12:43

标签: sql oracle

对于我正在制作的报告,我在此处有这样的查询:

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中有另一种更有效的方法,其中查询会查找从一周到给定日期的数据,并且数据将显示为查询中的列。

1 个答案:

答案 0 :(得分:0)

不幸的是,我们在公司的报告中做同样的事情,因为你的子查询使用gam.acid = eab.acid,你的子查询中需要gam.acid我假设“gam”是一个驱动表或其中一个您的查询中的主表,然后您必须为每个gam.acid

运行此迭代

有时我们以这种方式编写报表,有时我们对每个条件使用左连接而不是在select语句中使用子查询,这取决于dev的首选项,但两者都返回相同的东西,相同的性能。