有一个表有mac和accountnumber字段,大概取值如下:
mac         accountnumber
001             101
001             102
002             103
002             103
003             104
005             105
006             105
006             104
007             空
  
我现在需要sql语句或者存储过程呀,游标都可以,需要实现1个MAC地址只用过1个帐号情况的MAC地址数量,
1个MAC地址只用过2个帐号情况的MAC地址数量,
1个MAC地址只用过6-9个帐号情况的MAC地址数量。
求解

解决方案 »

  1.   


    SELECT COUNT(MAC)
      FROM (SELECT MAC, COUNT(ACCOUNTNUMBER)
              FROM TABLE_NAME
             GROUP BY MAC
            HAVING COUNT(MAC) = 1);--
    SELECT COUNT(MAC)
      FROM (SELECT MAC, COUNT(ACCOUNTNUMBER) OVER(PARTITION BY MAC) CNT
              FROM TABLE_NAME)
     WHERE CNT = 1;
      

  2.   

    要是我想求1个MAC地址只用过6-9个帐号情况的MAC地址数量的情况呢?
      

  3.   

    SELECT COUNT(CASE WHEN CNT = 1 THEN MAC ELSE NULL END) CNT1,
           COUNT(CASE WHEN CNT = 2 THEN MAC ELSE NULL END) CNT2,
           COUNT(CASE WHEN CNT >= 6 AND CNT <= 9 THEN MAC ELSE NULL END) CNT6_9
      FROM (SELECT MAC, COUNT(DISTINCT ACCOUNTNUMBER) CNT
              FROM TABLE_NAME
             GROUP BY MAC);
      

  4.   


    这个打印出来的结果和SELECT COUNT(MAC)
      FROM (SELECT MAC, COUNT(ACCOUNTNUMBER)
              FROM TABLE_NAME
             GROUP BY MAC
            HAVING COUNT(MAC) = 1);
    打印出来的结果不一样。当1个MAC地址只用过1个帐号情况的MAC地址数量,2个sql语句出来的结果不一样,第一个sql语句要比第二种sql语句汇总的结果要少
      

  5.   

    因为我用了distinct,你可以根据你自己的需要选择用不用distinct,区别在于:像下面这样的数据,用distinct 的话,001 算只用了一次,不用distinct 就算做2次,你自己根据你自己的情况进行选择。
    mac accountnumber
    001 101
    001 101
      

  6.   

    哦。那还有一个疑问,就是MAC为空的情况
      

  7.   

    不对呀,我看用了distinct语句查询出来的结果,数量还要多一点
      

  8.   

    MAX 为空不受影响,不想要在内层里面增加一个 where mac is not null。假设数据库里只有这两条记录:
    mac accountnumber
    001 101
    001 101用distinct 为1,不用distinct 为0,用的自然比不用多。
    原因是本身因为重复不算到1个里面的,因为剃重而算了,自然要多了。
      

  9.   


    with t as
    (
        select '001' as mac, '101' as accountnumber from dual
        union all
        select '001' as mac, '102' as accountnumber from dual
        union all
        select '002' as mac, '103' as accountnumber from dual
        union all
        select '002' as mac, '103' as accountnumber from dual
        union all
        select '003' as mac, '104' as accountnumber from dual
        union all
        select '001' as mac, '105' as accountnumber from dual
        union all
        select '005' as mac, '105' as accountnumber from dual
        union all
        select '006' as mac, '104' as accountnumber from dual
        union all
        select '006' as mac, '101' as accountnumber from dual
        union all
        select '007' as mac, null as accountnumber from dual
        union all
        select '001' as mac, '111' as accountnumber from dual
        union all
        select '001' as mac, '112' as accountnumber from dual
        union all
        select '001' as mac, '113' as accountnumber from dual
        union all
        select '001' as mac, '114' as accountnumber from dual
        union all
        select '001' as mac, '115' as accountnumber from dual 
    )
    select '一个MAC地址只用过2个账号的MAC数量' as type, count(*) as icount 
     from (select mac, count(distinct accountnumber) 
             from t where accountnumber is not null
             group by mac
            having count(distinct accountnumber) = 2)
    union all
    select '一个MAC地址只用过6-9个账号的MAC数量' as type, count(*) as icount
     from (select mac, count(distinct accountnumber) 
             from t where accountnumber is not null
             group by mac
            having count(distinct accountnumber) between 6 and 9)
      

  10.   

    大概可以写个存储过程,参数就是最小访问量和最大访问量,还有MAC的值。
    然后就返回数量就OK了。