【问题标题】:How to merge rows in select query result set如何合并选择查询结果集中的行
【发布时间】:2014-04-01 05:33:29
【问题描述】:

我的结果是这样的

date      acc     cr      date       acc     dr
---------------------------------------------------
null      null    0       13/3/12    A       1300
null      null    0       13/3/12    c       1200 
null      null    0       13/3/12    D       1100
13/3/12   A       1000    null       null    0
18/3/12   E       2000    null       null    0
19/3/12   F       3000    null       null    0
31/3/12   G       3000    null       null    0

我从以下查询中得到这个结果,加入 2 个表以获得 现金簿

select(case when mli.voucher_type = 1 THEN tav.voucher_date end)pdate,
(case when mli.voucher_type = 1 THEN mli.description end) acc,
(case when tav.voucher_type_id = 1 then sum(tvl.amount) else 0 end) cr,
(case when mli.voucher_type = 2 THEN tav.voucher_dateend) rdate,
(case when mli.voucher_type = 2 THEN mli.description end) acc,
(case when tav.voucher_type_id = 2 then sum(tvl.amount) else 0 end) dr
from t_acc_voucher tav
join t_voucher_ledger tvl on tvl.voucher_id = tav.voucher_id
join m_ledger_index mli on mli.ledger_index_id = tvl.ledger_index_id
group by mli.description, mli.voucher_type, tav.voucher_type_id,tav.voucher_date

我想要这样的结果

date      acc     cr      date       acc     dr
---------------------------------------------------
13/3/12   A       1000    13/3/12    A       1300
18/3/12   E       2000    13/3/12    c       1200
19/3/12   F       3000    13/3/12    D       1100
31/3/12   G       3000    null       null    0

任何机构都可以帮助我吗?或者给出一些建议是它编写的方式来获取它,或者我可以尝试使用 2 个不同的查询。 提前谢谢

【问题讨论】:

  • 将行 13/3/12 - A -- 100013/3/12 - A -- 1300 放在一起是否有任何逻辑?
  • 其实我想做现金簿。所以我需要这个结果集

标签: sql oracle merge


【解决方案1】:

将您的查询分成两个单独的查询,一个用于贷方,另一个用于借方,并根据降序进行完全外部联接,实际上您可以按任何列排序。从原始查询中,我假设 VOUCHER_TYPE = 1 是贷方,而 VOUCHER_TYPE = 2 是借方。

试试这个(未测试)

with CREDITS as (select TAV.VOUCHER_DATE PDATE,
                        MLI.DESCRIPTION ACC,
                        (case when TAV.VOUCHER_TYPE_ID = 1 then SUM(TVL.AMOUNT) else 0 end) CR
                   from t_acc_voucher tav
                   join t_voucher_ledger tvl 
                        on tvl.voucher_id = tav.voucher_id
                   join M_LEDGER_INDEX MLI 
                        on MLI.LEDGER_INDEX_ID = TVL.LEDGER_INDEX_ID
                  where MLI.VOUCHER_TYPE = 1
                  group by MLI.DESCRIPTION, 
                           MLI.VOUCHER_TYPE, 
                           TAV.VOUCHER_TYPE_ID,
                           TAV.VOUCHER_DATE),
      debits as (select TAV.VOUCHER_DATE RDATE,
                        MLI.DESCRIPTION ACC,
                        (case when TAV.VOUCHER_TYPE_ID = 2 then SUM(TVL.AMOUNT) else 0 end) DR
                   from T_ACC_VOUCHER TAV
                  where mli.voucher_type = 2
                   join t_voucher_ledger tvl 
                        on tvl.voucher_id = tav.voucher_id
                   join M_LEDGER_INDEX MLI 
                        on MLI.LEDGER_INDEX_ID = TVL.LEDGER_INDEX_ID
                  group by MLI.DESCRIPTION, 
                           MLI.VOUCHER_TYPE, 
                           TAV.VOUCHER_TYPE_ID,
                           TAV.VOUCHER_DATE  )
select T1.PDATE, T1.ACC, T1.CR, T2.RDATE, T2.ACC, T2.DR
  from (select a.*, row_number() over (order by a.PDATE) RN
          from credits a) T1
  full outer join 
        select b.*, row_number() over (order by b.RDATE) RN
          from debits b) T2
       on (t1.rn = t2.rn);

【讨论】:

    【解决方案2】:
    select t1.date1, t1.acc1, t1.cr, t2.date2, t2.acc2, t2.dr
    from (the table or query) t1 
        join (the table or query) t2 on t1.acc1=t2.acc2
    where t1.acc1 is not null
    

    我们通过 acc 将同一个查询(或表)连接两次 joinint 到自身。

    【讨论】:

    • 我添加了一些解释。
    • @Qantas94Heavy 加了几句解释
    • @Piyush 只是尝试将您的查询放置两次而不是(表或查询)
    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多