oracle sql问题,有两张表A,B 多对多,B有一属性name:a_1,a_2,b_1,b_2,c_1,c_2。 两张表关联查询。

以B表name分组统计记录数,如何实现a_1,a_2为一组(A表中记录就算这一组a的两个都对应也只算一条,一下同),b_1,b_2一组,c_1,c_2一组(如果一条A表记录对应一个a_1和b_1算两条)。怎么实现这样的实现呢,求指导,解决问题加分。

没太听明白呀,是不是这样
select sum(case when b.name in ('a_1','a_2') then 1 else 0) as a,
sum(case when b.name in ('b_1','b_2') then 1 else 0) as b,
sum(case when b.name in ('c_1','c_2') then 1 else 0) as c
from a,b where a.关联字段=b.关联字段追问

谢谢您的回答,本身是多对多关系,比如A表有一条数据,B表中有三条对应,name 分别是a_1,a_2,b_1. 我其实是想以a,b,c三种类型(实际表中不存在的这种关系)分组,这样时,a组下面count为1,b组下面count为1,c组count为0. 你上面的统计应该没有去掉这种组内重复呢。

追答

那就把你想分组的name写到同一个in里就OK吧?

你说的组内重复是什么意思,没懂呀

追问

就我上面说的那种情况,三条记录,a组下面count为2,b组下面count为1,c组count为0。而我需要的是a组下面count为1,b组下面count为1,c组count为0。('a_1','a_2' 为a组,'b_1','b_2'为b组,'c_1','c_2'为c组)

追答

select
case when sum(case when name like 'a%' then 1 else 0 end)>1 then 1 else sum(case when name like 'a%' then 1 else 0 end) end,
case when sum(case when name like 'b%' then 1 else 0 end)>1 then 1 else sum(case when name like 'b%' then 1 else 0 end) end,
case when sum(case when name like 'c%' then 1 else 0 end)>1 then 1 else sum(case when name like 'c%' then 1 else 0 end) end
from a,b
where a.关联字段=b.关联字段

做了个判断,组内如果大于1,就把值设置成1

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-14
先建立一个字段,把 a_1,a_2更新为一个值,把b_1,b_2更新为一个值,
然后使用这个字段做分组,就可以了吧。

如果是a_1,a_2,b_1,b_2这样的,也可以 select left(name,2) 作为一个虚拟字段,然后用这个虚拟字段作分组。追问

谢谢您的回答,实际名字有些不同呢,请问下虚拟字段怎么搞呢?

追答

select v from ( select left(name,2) as v from table ) a
group by v

第2个回答  2013-05-14
SELECT
SUBSTR(name, 1, INSTR (name, '_') -1 ),
SUM () / COUNT() ...... 相关函数
FROM
B JOIN A ON ( 关联条件 )
GROUP BY
SUBSTR(name, 1, INSTR (name, '_') -1 )追问

谢谢您的回答,能详细点吗

相似回答