消息关闭
    暂无新消息!

oracle group by 多个字段问题

问题作者 : 小良良2017-07-04发布
有一张表    二个字段 (表数据如下)
区域(name)    注册类型(type)
A区                        1
B区                         2
C区                         3

假设存在3个区,有三种注册类型,想查询出来的预想结果为

区域     注册类型     统计量
A区       1                    1
A区       2                    0
A区       3                    0
B区       1                   0
B区       2                   1
B区       3                   0
C区       1                  0
C区       2                  0
C区       3                  1

如果通过SQL查询出这样的结果呢

12个回答

︿ 3

with t as (
select 'A区' name,1 type from dual union all
select 'A区' name,1 type from dual union all
select 'A区' name,1 type from dual union all
select 'A区' name,1 type from dual union all
select 'B区' name,2 type from dual union all
select 'B区' name,2 type from dual union all
select 'B区' name,2 type from dual union all
select 'C区' name,3 type from dual)
select a.name, b.type,count(case when a.type=b.type then 1 end) aaa
from  (select distinct * from t) a,t b
group by a.name, b.type
order by 1,2;

有重复数据这么写试试
︿ 2

with t as (
select 'A区' name,1 type from dual union all
select 'B区' name,2 type from dual union all
select 'C区' name,3 type from dual)
select a.name, b.type,count(case when a.type=b.type then 1 end) aaa
from t a,t b
group by a.name, b.type
order by 1,2;
我验证了一下上面的确实能查出想要的数据但不是依据表查出来的
=================
︿ 2
还是没找到合适的SQL,感觉有点难通过 一个SQL搞定,区域是动态的,
︿ 2
  数据是对的,但是记录数不对, select AAB301 ,REGTYPE ,count(0) as value  from wsbs_person  group by(AAB301,REGTYPE)  这是我写的统计
︿ 1
with t as (
select 'A' as name1,1 as type1 from dual
union all
select 'B' as name1,2 as type1 from dual
union all
select 'C' as name1,3 as type1 from dual
)

select a.name1,b.type1,sum(decode(b.type1,a.type1,1,0))
from t a ,t b 
group by a.name1,b.type1
order by a.name1,b.type1
︿ 1
with t as (
select 'A区' name,1 type from dual union all
select 'B区' name,2 type from dual union all
select 'C区' name,3 type from dual)
select name, a.type, nvl2(b.type, 1, 0)
  from (select distinct type from t) a
  left join t b partition by(b.name)
    on a.type = b.type;
︿ 0
如果实际业务中是编码表+数据表(前面给的表),应该是数据表先直接GROUP BY
结果再与编码表外连接
︿ 0

with t as (
select 'A区' name,1 type from dual union all
select 'B区' name,2 type from dual union all
select 'C区' name,3 type from dual)
select a.name, b.type,count(case when a.type=b.type then 1 end) aaa
from t a,t b
group by a.name, b.type
order by 1,2;