关于一个select中多个SQL的计算问题

百曉生 2017-10-30 05:07:28
在一个select中多次count,然后将count值计算,结果报错【标识符无效】,
select count((select id
from (select id from xjrw1 where xl = '仙剑一') a1
where a1.id = x.id)) xj1,
count((select id
from (select id from xjrw1 where xl = '仙剑二') a2
where a2.id = x.id)) xj2,
count((select id
from (select id from xjrw1 where xl = '仙剑三') a3
where a3.id = x.id)) xj3
--,round(xj1+xj2) t
from xjrw1 x

以下是表的内容

注释部分如果取消就报错,我知道可以将整个SQL括起来,然后外边再查询,这样查出的xj1,xj2,xj3的值可以计算,
问题是:
能否不用再括起来的方式,而是在查询统计时直接可以进行计算(因为一些原因,不能使用将整个SQL括起来再查询然后计算的方式)
求教!
...全文
678 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
百曉生 2017-11-09
  • 打赏
  • 举报
回复
引用 13 楼 qq646748739 的回复:
[quote=引用 12 楼 u012421456 的回复:] [quote=引用 11 楼 qq646748739 的回复:] 还有问题吗?如果没有了,此楼结贴!
已结贴[/quote] 结错楼了,少了50个可用分![/quote] 结错楼是什么意思
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
引用 12 楼 u012421456 的回复:
[quote=引用 11 楼 qq646748739 的回复:]
还有问题吗?如果没有了,此楼结贴!

已结贴[/quote]
结错楼了,少了50个可用分!
百曉生 2017-10-31
  • 打赏
  • 举报
回复
引用 11 楼 qq646748739 的回复:
还有问题吗?如果没有了,此楼结贴!
已结贴
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
还有问题吗?如果没有了,此楼结贴!
百曉生 2017-10-31
  • 打赏
  • 举报
回复
引用 9 楼 qq646748739 的回复:
[quote=引用 8 楼 百曉生的回复:][quote=引用 7 楼 qq646748739 的回复:] 顺便说下: 在整数计算中,round加与不加,计算结果都是一样的。为了优化,去掉round 试试这个SQL:
 
select max(decode(xl,'仙剑一',cnt,null))+max(decode(xl,'仙剑二',cnt,null)) as x12,  --计算xj1+xj2
       max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x23,  --计算xj2+xj3
	   max(decode(xl,'仙剑一',cnt,null))+max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x123, --计算xj1+xj2+xj3
  from(select x1,count(*) as cnt
		 from xjrw1
		where xl in ('仙剑一','仙剑二','仙剑三')
		group by x1
	   )
 
提供的SQL的确有助于解决问题,但是这个报错请问是什么原因呢[/quote] x123后面多了一个逗号,[/quote] 多谢
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
引用 8 楼 百曉生的回复:
[quote=引用 7 楼 qq646748739 的回复:]
顺便说下: 在整数计算中,round加与不加,计算结果都是一样的。为了优化,去掉round
试试这个SQL:
 
select max(decode(xl,'仙剑一',cnt,null))+max(decode(xl,'仙剑二',cnt,null)) as x12, --计算xj1+xj2
max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x23, --计算xj2+xj3
max(decode(xl,'仙剑一',cnt,null))+max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x123, --计算xj1+xj2+xj3
from(select x1,count(*) as cnt
from xjrw1
where xl in ('仙剑一','仙剑二','仙剑三')
group by x1
)

提供的SQL的确有助于解决问题,但是这个报错请问是什么原因呢[/quote] x123后面多了一个逗号,
百曉生 2017-10-31
  • 打赏
  • 举报
回复
引用 7 楼 qq646748739 的回复:
顺便说下: 在整数计算中,round加与不加,计算结果都是一样的。为了优化,去掉round
试试这个SQL:
 
select max(decode(xl,'仙剑一',cnt,null))+max(decode(xl,'仙剑二',cnt,null)) as x12, --计算xj1+xj2
max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x23, --计算xj2+xj3
max(decode(xl,'仙剑一',cnt,null))+max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x123, --计算xj1+xj2+xj3
from(select x1,count(*) as cnt
from xjrw1
where xl in ('仙剑一','仙剑二','仙剑三')
group by x1
)

提供的SQL的确有助于解决问题,但是这个报错请问是什么原因呢
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
顺便说下: 在整数计算中,round加与不加,计算结果都是一样的。为了优化,去掉round
试试这个SQL:
 
select max(decode(xl,'仙剑一',cnt,null))+max(decode(xl,'仙剑二',cnt,null)) as x12, --计算xj1+xj2
max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x23, --计算xj2+xj3
max(decode(xl,'仙剑一',cnt,null))+max(decode(x1,'仙剑二',cnt,null))+max(decode(x1,'仙剑三',cnt,null)) as x123, --计算xj1+xj2+xj3
from(select x1,count(*) as cnt
from xjrw1
where xl in ('仙剑一','仙剑二','仙剑三')
group by x1
)

acen_chen 2017-10-31
  • 打赏
  • 举报
回复
那你先做个视图再处理好了。。。
百曉生 2017-10-31
  • 打赏
  • 举报
回复
引用 4 楼 qq646748739 的回复:
根据你的需求,我的SQL并没有使用括号。 即使查询其他字段,也可以完全做到不用括号。 关键是把你要求的效果描述出来,最好用数据说话。
这样查,可以查出仙剑一、仙剑二、仙剑三的数据量,4,4,5,我的目的是这几个数字可以在sql中计算,如5/(4+4),就像我上面说的那样【round(xj1+xj2) t】,得到计算的值
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
根据你的需求,我的SQL并没有使用括号。
即使查询其他字段,也可以完全做到不用括号。

关键是把你要求的效果描述出来,最好用数据说话。
碧水幽幽泉 2017-10-31
  • 打赏
  • 举报
回复
引用 2 楼 u012421456 的回复:
[quote=引用 1 楼 qq646748739 的回复:]
给你一个简单的SQL,性能也较好。

select id,x1,count(*)
from xjrw1
where xl in ('仙剑一','仙剑二','仙剑三')
group by id,x1

嗯,这个的确不错,然而并没有解决我的问题[/quote]
你的问题是什么? 我目测实现也是比较简单。
百曉生 2017-10-31
  • 打赏
  • 举报
回复
引用 1 楼 qq646748739 的回复:
给你一个简单的SQL,性能也较好。

select id,x1,count(*) 
  from xjrw1
 where xl in ('仙剑一','仙剑二','仙剑三')
 group by id,x1
嗯,这个的确不错,然而并没有解决我的问题
碧水幽幽泉 2017-10-30
  • 打赏
  • 举报
回复
给你一个简单的SQL,性能也较好。

select id,x1,count(*)
from xjrw1
where xl in ('仙剑一','仙剑二','仙剑三')
group by id,x1

17,377

社区成员

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

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