SQl实在不会写,只能拿来主义了,各位高手帮忙看下

wxh1108 2016-08-12 12:05:23
表如下图,money1是id1的金额是总金额,money2是id2的金额是第一次分解的金额,是由money1分解得来的。money3是id3的金额是第二次分解的金额,是由money2分解得来的,现在客户需要一张分解跟踪情况表,大概是这样子的,请高手指教如何写SQL。
表结构和数据
create table TMP_T
(
id1 VARCHAR2(60) not null,
id2 VARCHAR2(60),
money1 NUMBER(16,2) not null,
money2 NUMBER,
id3 VARCHAR2(60),
money3 NUMBER(16,2)
)

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008407', 'BI_BL_0000000000060041', 900000.00, 900000, 'BI_BL_0000000000060041', 900000.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008408', 'BI_BL_0000000000060023', 210000.00, 210000, 'BI_BL_0000000000060023', 210000.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060046', 520000.00, 50000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060044', 520000.00, 80000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060036', 520000.00, 40000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060040', 520000.00, 10000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060047', 520000.00, 40000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060042', 520000.00, 50000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060038', 520000.00, 40000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060039', 520000.00, 30000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 1833.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 4000.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 4184.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 34400.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 37000.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 324.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 1400.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060045', 520000.00, 100000, 'BI_BL_0000000000060045', 3600.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060043', 520000.00, 40000, 'BI_BL_0000000000060043', 2160.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060043', 520000.00, 40000, 'BI_BL_0000000000060043', 1490.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060043', 520000.00, 40000, 'BI_BL_0000000000060043', 916.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060043', 520000.00, 40000, 'BI_BL_0000000000060043', 27200.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060043', 520000.00, 40000, 'BI_BL_0000000000060043', 1000.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060043', 520000.00, 40000, 'BI_BL_0000000000060043', 7000.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008409', 'BI_BL_0000000000060037', 520000.00, 40000, 'BI_BL_0000000000060037', 40000.00);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008410', 'BI_BL_0000000000060053', 421354.80, 421354.8, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008411', 'BI_BL_0000000000060052', 424000.00, 424000, null, null);

insert into tmp_t (ID1, ID2, MONEY1, MONEY2, ID3, MONEY3)
values ('ABI_ADD_008412', 'BI_BL_0000000000061314', 180000.00, 180000, null, null);
...全文
161 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdsnhan 2016-08-15
  • 打赏
  • 举报
回复
刚才的有漏洞,这个更严密

  select decode(id1,lag(id1) over(order by id1),null,id1),
         decode(id1,lag(id1) over(order by id1),decode(money1,lag(money1) over(order by id1),null,money1),money1),
         decode(id2,lag(id2) over(order by id2),null,id2),
         decode(id2,lag(id2) over(order by id2),decode(money2,lag(money2) over(order by id2),null,money2),money2),
         decode(id3,lag(id3) over(order by id3),null,id3),
         decode(id3,lag(id3) over(order by id3),decode(money3,lag(money3) over(order by id3),null,money3),money3)
  from tmp_t 
  order by id1
jdsnhan 2016-08-15
  • 打赏
  • 举报
回复
引用 4 楼 wxh1108 的回复:
[quote=引用 2 楼 jdsnhan 的回复:] 对啊。业务约束是什么。ID2通过什么知道哪些是由ID1分解来的
其实没啥约束,就是怎么对原始表进行去重才能得到后面的结果[/quote] 要是仅去重就简单了。

 select decode(id1,lag(id1) over(order by id1),null,id1),
         decode(money1,lag(money1) over(order by id1),null,money1),
         decode(id2,lag(id2) over(order by id2),null,id2),
         decode(money2,lag(money2) over(order by id1),null,money2),
         decode(id3,lag(id3) over(order by id3),null,id3),
         decode(money3,lag(money3) over(order by id3),null,money3)
  from tmp_t 
  order by id1
ghx287524027 2016-08-12
  • 打赏
  • 举报
回复
select case when id1<>nvl(lag(id1)over(partition by id1 order by id1),0) then id1 else null end id1, case when money1<>nvl(lag(money1)over(partition by id1 order by id1),0) then money1 else null end money1, case when id2<>nvl(lag(id2)over(partition by id1,id2 order by id1),0) then id2 else null end id2, case when money2<>nvl(lag(money2)over(partition by id1,id2 order by id1),0) then money2 else null end money2, case when id3<>nvl(lag(id3)over(partition by id1,id2,id3 order by id1),0) then id3 else null end id3, case when money3<>nvl(lag(money3)over(partition by id1,id2,id3 order by id1),0) then money3 else null end money3 from ( select distinct id1,money1,id2,money2,id3,money3 from TMP_T order by id1,id2,id3 )
wxh1108 2016-08-12
  • 打赏
  • 举报
回复
引用 8 楼 ghx287524027 的回复:
sorry,同id处理一下money就可以了
select 
case when id1<>nvl(lag(id1)over(order by id1),0) then id1 else null end id1,
case when money1<>nvl(lag(money1)over(order by id1),0) then money1 else null end money1,
case when id2<>nvl(lag(id2)over(order by id1),0) then id2 else null end id2,
case when money2<>nvl(lag(money2)over(order by id1),0) then money2 else null end money2,
case when id3<>nvl(lag(id3)over(order by id1),0) then id3 else null end id3,
case when money3<>nvl(lag(money3)over(order by id1),0) then money3 else null end money3
from (
select  distinct id1,money1,id2,money2,id3,money3 
from TMP_T 
order by id1,id2,id3
)
用这种方式进行id去重肯定是对的,但是对于money来说就不一定对了,因为money是要和id对照着看的,比如 id=a money=2 id=b money=2,id=c money=2,这三个monye虽然是重复的,但都不能去掉,因为它们是对应不同的id的
ghx287524027 2016-08-12
  • 打赏
  • 举报
回复
sorry,同id处理一下money就可以了
select 
case when id1<>nvl(lag(id1)over(order by id1),0) then id1 else null end id1,
case when money1<>nvl(lag(money1)over(order by id1),0) then money1 else null end money1,
case when id2<>nvl(lag(id2)over(order by id1),0) then id2 else null end id2,
case when money2<>nvl(lag(money2)over(order by id1),0) then money2 else null end money2,
case when id3<>nvl(lag(id3)over(order by id1),0) then id3 else null end id3,
case when money3<>nvl(lag(money3)over(order by id1),0) then money3 else null end money3
from (
select  distinct id1,money1,id2,money2,id3,money3 
from TMP_T 
order by id1,id2,id3
)
wxh1108 2016-08-12
  • 打赏
  • 举报
回复
引用 6 楼 ghx287524027 的回复:
[quote=引用 5 楼 wxh1108 的回复:] [quote=引用 2 楼 jdsnhan 的回复:] 对啊。业务约束是什么。ID2通过什么知道哪些是由ID1分解来的
其实结果就是对原表进行去重得到的[/quote] 上面不是已经给你写了吗,只是不知道你是怎么排序的[/quote] 大神,你给我写的,money没有去重阿,仅仅是把ID去重了
ghx287524027 2016-08-12
  • 打赏
  • 举报
回复
引用 5 楼 wxh1108 的回复:
[quote=引用 2 楼 jdsnhan 的回复:] 对啊。业务约束是什么。ID2通过什么知道哪些是由ID1分解来的
其实结果就是对原表进行去重得到的[/quote] 上面不是已经给你写了吗,只是不知道你是怎么排序的
wxh1108 2016-08-12
  • 打赏
  • 举报
回复
引用 2 楼 jdsnhan 的回复:
对啊。业务约束是什么。ID2通过什么知道哪些是由ID1分解来的
其实结果就是对原表进行去重得到的
wxh1108 2016-08-12
  • 打赏
  • 举报
回复
引用 2 楼 jdsnhan 的回复:
对啊。业务约束是什么。ID2通过什么知道哪些是由ID1分解来的
其实没啥约束,就是怎么对原始表进行去重才能得到后面的结果
ghx287524027 2016-08-12
  • 打赏
  • 举报
回复
select 
case when id1<>nvl(lag(id1)over(order by id1),0) then id1 else null end id1,money1,
case when id2<>nvl(lag(id2)over(order by id1),0) then id2 else null end id2,money2,
case when id3<>nvl(lag(id3)over(order by id1),0) then id3 else null end id3,money3
from (
select  distinct id1,money1,id2,money2,id3,money3 
from TMP_T 
order by id1,id2,id3
)
jdsnhan 2016-08-12
  • 打赏
  • 举报
回复
对啊。业务约束是什么。ID2通过什么知道哪些是由ID1分解来的
ghx287524027 2016-08-12
  • 打赏
  • 举报
回复
id1,id2,id3 之间有什么对应关系吗?

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧