表字段如下:
ID STATUS其中STATUS是按位与的字段
假设bitand(status, 8)>0的记录类型为A
    bitand(status, 4)>0的记录类型为B
    bitand(status, 2)>0的记录类型为C
    bitand(status, 1)>0的记录类型为D我想查询出该表中各种类型的数据数量,形式如下:类型 数量
A 12
B 1
C 32
D 0请问SQL该怎么写?
表数据量有20w左右,类型有大概10种

解决方案 »

  1.   

    to yuanjieing: 方法好可以加分to bayueguihuaxiang: 就是说有一个按位表示不同状态的字段,要统计每个状态的记录数
      

  2.   

    木有看明白,不知道是不是这样个意思?
    select (case when bitand(STATUS,8) > 0 then 'A' when ..... end),count(*) from table
    group by (case when bitand(STATUS,8) > 0 then 'A' when ..... end)
      

  3.   

    这个地方我补充问一下
    bitand(status, 8)>0
      bitand(status, 4)>0
    两个条件都满足  那么显示哪个类型?
      

  4.   


    --Oracle 11g Code
    --测试表创建
    create table ss
    (
       status number
    )
    --测试数据
    insert into ss values(1)
    insert into ss values(12);
    insert into ss values(21);
    insert into ss values(2);
    insert into ss values(3);
    insert into ss values(4);
    insert into ss values(5);
    insert into ss values(8);
    insert into ss values(9);
    --查询
    select s.*,count(s.类型) from(
    select 
      (case
      when bitand(status,8)>0
      then 'A'
      when bitand(status,4)>0
      then 'B'
      when bitand(status, 2)>0
      then 'C'
      when bitand(status, 1)>0
      then 'D'
      end)as 类型
    from ss) s
    group by s.类型
    order by s.类型
    --数据结果
    A 3
    B 3
    C 2
    D 1
      

  5.   

    to oulinhnzz: 如果都满足,在两个类型里面都要计数
      

  6.   

    to skipsol:--那查询就更改为这样
    select *from (
    select 'A' as 类型,count(1) from ss
    where bitand(status,8)>0
    union all
    select 'B' as 类型,count(1) from ss
    where bitand(status,4)>0
    union all
    select 'C' as 类型,count(1) from ss
    where bitand(status,2)>0
    union all
    select 'D' as 类型,count(1) from ss
    where bitand(status,1)>0) s
    order by s.类型
      

  7.   


    --结果如下
    A 3
    B 4
    C 2
    D 5
      

  8.   


    --数据结果
    A 3
    B 4
    C 2
    D 5