这样的SQL语句怎么写

忠向 2016-05-13 10:46:37
一个表(假设名称为TAB1),按照某个字段取值(字段名称为LX,取值范围是:维护或者措施)
其他字段信息如下:

表TAB1:
字段:
ID---number(8)
FY---number(8,3)
LX---varchar(6) 取值范围是:维护或者措施


现在需要这样的结果:

获取维护、措施的分别费用,以及合计的费用,我初步这样写的:

select ID, FY_WH, FY_CS, ( FY_WH+ FY_CS)
(select FY as FY_WH from TAB1 where LX='维护') a,
(select FY as FY_CS from TAB1 where LX='措施') b
where a.ID=b.ID

这里省略了NVL的函数

最大的问题是,这个where条件,可能某个ID没有 措施只有维护,或者某个 ID没有 维护只有措施 的工作,这样内链接得到的就是空数据

我想有没有对这种情形好一点的处理方法?

谢谢
...全文
204 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
世界便美 2016-05-13
  • 打赏
  • 举报
回复
select lx,fy,count(fy) from TAB1 groupby lx; 这样不可以吗??? 大概意思
ORAClE SE 2016-05-13
  • 打赏
  • 举报
回复
楼主好人,分析函数拿去用,记得给分
忠向 2016-05-13
  • 打赏
  • 举报
回复
where 的条件要是能这样写就好了: where a.ID=b.ID(+) or a.ID(+)=b.ID 只是这不行呀
忠向 2016-05-13
  • 打赏
  • 举报
回复
虽然我知道这里面其实就是个全连接问题,但是不知道为何,用一个表做全连接,总提示 ora00918错误,实在没法子,只得把全连接用 左、右来代替,这样居然没问题,只是语句看着相当笨拙了。 我现在用了个最笨的法子解决了问题: select a ID, FY_WH, FY_CS, ( FY_WH+ FY_CS) (select FY as FY_WH from TAB1 where LX='维护' group by ID) a, (select FY as FY_CS from TAB1 where LX='措施' group by ID) b where a.ID=b.ID(+) union select a ID, FY_WH, FY_CS, ( FY_WH+ FY_CS) (select FY as FY_WH from TAB1 where LX='维护' group by ID) a, (select FY as FY_CS from TAB1 where LX='措施' group by ID) b where a.ID(+)=b.ID
忠向 2016-05-13
  • 打赏
  • 举报
回复
引用 4 楼 u012142404 的回复:
select LX,sum(FY) from TAB1 GROUP BY LX; select sum(FY) from tab1; 这个就出现结果了,不知道是不是这个意思呢
非常感谢您的细致解答,只是您漏掉了一个id字段,group 是按照id来处理的,这个我在首楼确实疏忽了,非常抱歉
忠向 2016-05-13
  • 打赏
  • 举报
回复
引用 6 楼 shanying_lv 的回复:
楼主用全外连接试下

select  nvl(a.ID,b.ID), FY_WH,  FY_CS, ( nvl(FY_WH,0)+ nvl(FY_CS,0)) FROM 
(select  ID ,FY  as  FY_WH from TAB1 where LX='维护') a
FULL OUTER JOIN 
(select  ID ,FY  as FY_CS from TAB1 where LX='措施') b
 ON a.id=b.id

这样我试过,不知道为何,总提示 ora918错误,好像全连接不能针对一个表
土豆番茄 2016-05-13
  • 打赏
  • 举报
回复
楼主用全外连接试下

select  nvl(a.ID,b.ID), FY_WH,  FY_CS, ( nvl(FY_WH,0)+ nvl(FY_CS,0)) FROM 
(select  ID ,FY  as  FY_WH from TAB1 where LX='维护') a
FULL OUTER JOIN 
(select  ID ,FY  as FY_CS from TAB1 where LX='措施') b
 ON a.id=b.id

z123zjf 2016-05-13
  • 打赏
  • 举报
回复
按你写的,全外连接 或者按ID分组,用decode将维护和措施分别取出,根据你给的条件,ID在相同取值范围不会重复。
世界便美 2016-05-13
  • 打赏
  • 举报
回复



select LX,sum(FY) from TAB1 GROUP BY LX;
select sum(FY) from tab1;
这个就出现结果了,不知道是不是这个意思呢

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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