这样试试,可能不太好,但能得到结果,应该用分析函数可以实现的。。select virusname,srcip,VirusTotal,DstIPCount from (
select virusname,virusname virus,'' srcip,count(rowid) VirusTotal,count(distinct DstIP) DstIPCount from aa group by virusname
union all
select '' virusname,VirusName virus,SrcIP,count(rowid) VirusTotal,count(distinct DstIP) DstIPCount
from aa group by VirusName,SrcIP)
order by virus,virustotal desc;

解决方案 »

  1.   

    这一列 DstIPCount
    指的是什么?
      

  2.   

    谢谢你这么快的答复,不过我试了一下没有成功,显示的错误信息是数据类型不一致之类的。还有,
    select '' virusname和'' srcip中的'' 符号是什么意思?
    我的表结构可能写的好不是很清晰,我再写的详细些,请你再帮我看看。表结构:(表名:t_Alert)
    VirusID     VirusName     SrcIP        DstIP
    -------------------------------------------------
    1             worm1         1.2.3.4      5.6.7.8
    2             worm1         6.7.8.9      2.1.3.2
    3             backdoor      ....         .....
    4             toy
    5             hacker
    6             ...
    ..             ...其中VirusID代表了每个Virus信息记录是没有重复值的。用sql语句统计后,要求得到
    1。每个VirusName类别的Virus数量。
    2。每个VirusName类别中来自不同SrcIP的Virus的数量。
    3。每个VirusName类别中来自不同SrcIP的Virus的DstIP(目标IP)的个数(同一个DstIP只计数1次)。要求显示如下的结果:VirusName      SrcIP          VirusTotal                    DstIPCount
    -----------------------------------------------------------------------
    worm1                          30(worm1总数)                   5
                  1.2.3.4          10(1.2.3.4来的worm1的数量)      3
                  6.7.8.9          20(6.7.8.9来的worm1的数量)      2backdoor                       132                             13
                  2.3.4.5          15                              3
                  4.5.6.7          25                              5
                  .......          ..                              .
    .......因为对sql还不太熟悉,请高手详细指点。
      

  3.   

    我测试过的,是成功的
    我用的virusid是number型的,其它都是varchar2型的
      

  4.   

    真正的表中有将近30个字段,为了便于描述,我只列出了我认为用得着的字段,其他的还有很多的
    时间等其他的字段就没有列出来了。我再把真实的表中得字段列出来,请大家帮我再看看。表1 t_Alert:
    (说明)      病毒警告ID     病毒内容描述ID        病毒来源IP地址   病毒攻击目标IP地址
    (数据类型)  number型       number型              number型          number型
                ulAlertID      ulSignatureID         ulSrcIP           ulDstIP
    -----------------------------------------------------------------------------------
                1001           100056                1062731766        1062731787 
                1002           100057                1062731763        1062731768
                1003           100058                .......           ........表2 t_msg:
    (说明)      病毒内容描述ID   病毒内容
    (数据类型)  number型         text型
                ulSignatureID     MSG
    -----------------------------------------
                100056            BACKDOOR1
                100057            TOY1现有的表结构如上所示,不知道写的请不清楚。
    对了,请注意ulSrcIP 和ulDstIP 是数字型的,统计出来以后再转换成字符型的。ATGC(这一生受了很多委屈吃了很多苦。。),不好意思,可能是这个地方的类型不一致,请你
    帮我改一下下面我用的语句:select ulSignatureID,ulSrcIP,VirusTotal,DstIPCount 
    from (select ulSignatureID,ulSignatureID virus,'' ulSrcIP,count(ulAlertID) VirusTotal,count(distinct ulDstIP) DstIPCount 
          from t_Alert 
          group by ulSignatureID
          union all 
          select '' ulSignatureID,ulSignatureID virus,ulSrcIP,count(ulAlertID) VirusTotal,count(distinct ulDstIP) DstIPCount
          from t_Alert 
          group by ulSignatureID,ulSrcIP)
    order by virus,virustotal desc;
      

  5.   

    re:liuyi8903(西西) DstIPCount 指的是:每个VirusName类别中来自不同SrcIP的Virus的攻击的DstIP(目标IP)的个数(同一个DstIP只计数1次),既是表1 t_Alert 中 ulDstIP 的计数,重复的同一个ulDstIP只计数1次。不知道我说清楚了没有,请帮我看看怎么用sql语句实现,谢谢。
      

  6.   

    select ulSignatureID,ulSrcIP,VirusTotal,ulDstIPCount from (
    select ulSignatureID,ulSignatureID virus,to_number('') ulSrcIP,count(rowid) VirusTotal,count(distinct ulDstIP) ulDstIPCount from aa group by ulSignatureID
    union all
    select to_number('') ulSignatureID,ulSignatureID virus,ulSrcIP,count(rowid) VirusTotal,count(distinct ulDstIP) ulDstIPCount
    from aa group by ulSignatureID,ulSrcIP)
    order by virus,virustotal desc;
      

  7.   

    ATGC(这一生受了很多委屈吃了很多苦。。) 谢谢你,访问成功了,你对oracle很熟吧。以后有机会再向你请教。也谢谢大家的回帖。