请教一个对账的SQL

ustb 2013-09-24 10:33:32


上图是源数据,其中最后一列的channel_id标识出了要对比的记录行,即,与其stat_date, com_code, factory_code, unit相同且sys_id与channel_id相同的行为对比行。现在需要将记录转换成下图的形式。请教如何写这个SQL。


...全文
511 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ustb 2013-09-25
  • 打赏
  • 举报
回复
引用 5 楼 gioh0022 的回复:
[quote=引用 4 楼 ustb 的回复:] [quote=引用 1 楼 u010412956 的回复:] 没怎么看懂你的需求。
简单点说就是将要对比的数据由行记录转成列记录,并过滤掉已转的行记录。比如:在图1中第6行,其stat_date,com_code,client_code, unit与第3行一致,而其channel_id是20,这指向的是第3行的sys_id,也就是说这两行记录要做对比。 另外stat_date,com_code,client_code, unit, sys_id是做了唯一索引的,不会有重复[/quote] 看3楼是否满足需求[/quote] 厉害呀,已经满足需求了,非常感谢!
  • 打赏
  • 举报
回复
引用 4 楼 ustb 的回复:
[quote=引用 1 楼 u010412956 的回复:] 没怎么看懂你的需求。
简单点说就是将要对比的数据由行记录转成列记录,并过滤掉已转的行记录。比如:在图1中第6行,其stat_date,com_code,client_code, unit与第3行一致,而其channel_id是20,这指向的是第3行的sys_id,也就是说这两行记录要做对比。 另外stat_date,com_code,client_code, unit, sys_id是做了唯一索引的,不会有重复[/quote] 看3楼是否满足需求
ustb 2013-09-25
  • 打赏
  • 举报
回复
引用 1 楼 u010412956 的回复:
没怎么看懂你的需求。
简单点说就是将要对比的数据由行记录转成列记录,并过滤掉已转的行记录。比如:在图1中第6行,其stat_date,com_code,client_code, unit与第3行一致,而其channel_id是20,这指向的是第3行的sys_id,也就是说这两行记录要做对比。 另外stat_date,com_code,client_code, unit, sys_id是做了唯一索引的,不会有重复
  • 打赏
  • 举报
回复
先找出相同行,再剔除得出不符合相同行的求并集
WITH t AS (
select 20130903 state_date,1120 com_code,0044 client_code,50 amount,'cny'unit,30 sys_id,NULL channel_id from dual UNION
select 20130903 state_date,1120 com_code,0057 client_code,10 amount,'cny'unit,30 sys_id,NULL channel_id from dual UNION
select 20130903 state_date,1120 com_code,0044 client_code,100 amount,'cny'unit,20 sys_id,NULL channel_id from dual UNION
select 20130903 state_date,1120 com_code,0045 client_code,136 amount,'cny'unit,20 sys_id,NULL channel_id from dual UNION
select 20130903 state_date,1120 com_code,0057 client_code,10 amount,'cny'unit,1 sys_id,30 channel_id from dual UNION
select 20130903 state_date,1120 com_code,0044 client_code,300 amount,'cny'unit,1 sys_id,20 channel_id from dual )
(select t1.state_date,t1.com_code,t1.client_code,t1.amount AS amount1,t1.sys_id,t2.amount AS amount2,t1.channel_id 
from t t1, t t2 
WHERE nvl(t1.channel_id,0)=t2.sys_id AND  t1.state_date=t2.state_date
AND t1.com_code=t2.com_code AND t1.client_code=t2.client_code AND t1.unit=t2.unit )UNION
(select state_date,com_code,client_code,amount AS amount1,sys_id,NULL AS amount2 ,channel_id from t WHERE channel_id IS NULL 
MINUS 
select t2.state_date,t2.com_code,t2.client_code,t2.amount AS amount1,t2.sys_id,NULL AS amount2 ,t2.channel_id
 from t t1,t t2 WHERE t1.channel_id IS NOT NULL AND t2.channel_id IS NULL
AND  t1.state_date=t2.state_date
AND t1.com_code=t2.com_code AND t1.client_code=t2.client_code AND t1.unit=t2.unit AND t2.sys_id=t1.channel_id)
  • 打赏
  • 举报
回复
需求大致懂了 这个 貌似用子查询就可以做出来了 然后 如果有多行数据和这行相同呢 怎么取
u010412956 2013-09-24
  • 打赏
  • 举报
回复
没怎么看懂你的需求。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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