USERID  ORDERID  TONS
u001    o001      20
u001    o002      40
u001    o003      45
u002    o005      20
....    ....      ..类似有这样的表,如何查出每个用户TONS(只有三种,如上例)20的单有多少,40的多少,45的多少.
然后所有20的多少,40的多少,45的多少.
要求在Oracle Discover里查出,一次查询显示出来.
只是现在我的分类总计查不出.请大家帮忙,一早来就有人在催了.

解决方案 »

  1.   

    是这样吗?
    SQL> select * from b;USERID               ORDERID                    TONS
    -------------------- -------------------- ----------
    u001                 o001                         20
    u001                 o002                         40
    u001                 o003                         45
    u002                 o004                         40
    u002                 o005                         45
    u003                 o006                         206 rows selectedSQL> 
    SQL> SELECT decode(grouping(userid),1,'总计',userid) userid,
      2         SUM(decode(tons, 20, 1, 0)) cnt20,
      3         SUM(decode(tons, 40, 1, 0)) cnt40,
      4         SUM(decode(tons, 45, 1, 0)) cnt45
      5  FROM   b
      6  GROUP  BY ROLLUP(userid)
      7  /USERID                    CNT20      CNT40      CNT45
    -------------------- ---------- ---------- ----------
    u001                          1          1          1
    u002                          0          1          1
    u003                          1          0          0
    总计                          2          2          2
      

  2.   

    duanzilin(寻) ( ) 
    老大,你给的在我的机器不行
    我用的是oracle discover
    版本9i的,你在sql&plus下的grouping在我的工具下不可用
    报语法错误,说在EUL中找不到或是没注册.应该如何做下一步?
      

  3.   

    不支持grouping?那用这个行不行:
    SELECT nvl(userid,'总计') userid, 
           SUM(decode(tons, 20, 1, 0)) cnt20, 
           SUM(decode(tons, 40, 1, 0)) cnt40, 
           SUM(decode(tons, 45, 1, 0)) cnt45
    FROM   b
    GROUP  BY ROLLUP(userid)会不会不支持rollup?
      

  4.   

    SELECT nvl(userid,'总计') userid, 
           SUM(decode(tons, 20, 1, 0)) cnt20, 
           SUM(decode(tons, 40, 1, 0)) cnt40, 
           SUM(decode(tons, 45, 1, 0)) cnt45
    FROM   b
    GROUP  BY userid
    UNION ALL 
    SELECT NULL AS userid, 
           SUM(decode(tons, 20, 1, 0)) cnt20, 
           SUM(decode(tons, 40, 1, 0)) cnt40, 
           SUM(decode(tons, 45, 1, 0)) cnt45
    FROM   b
      

  5.   

    真的不支持rollup,报同样的错,没在EUL中注册
    这可如何是好呢?
      

  6.   

    没用过这个工具,rollup 在8i之前就支持的,怎么这个工具到9i还连基本的功能都不能支持,实在不行就用union吧,使用union造成重复查询会降低很多效率
      

  7.   

    各位老大,我的源码如下,请看下是不是有什么冲突的地方.
    SELECT  CNTR.CNTRID,CNTR.CUSTORDNO,CNTR.CNTRSIZE, 
    CTMSAMRD_PRDN.REVSTR(CNTR.CNTRNO),
    CNTR.CNTRNO, 
    SUM(decode(CNTR.CNTRSIZE,20,1,0)) Ctrn20,
    SUM(decode(CNTR.CNTRSIZE,40,1,0)) Ctrn40,
    SUM(decode(CNTR.CNTRSIZE,45,1,0)) Ctrn45, 
    CNTR.CUSTID, CNTRIMP.CNTRID, CNTRIMP.ETA,
      CNTRIMP.DISVSL, CNTRIMP.DVOYNO
    FROM 
    CTMSAMRD_PRDN.CNTR CNTR, CTMSAMRD_PRDN.CNTRIMP CNTRIMP
    WHERE 
    ( ( CNTR.CNTRID = CNTRIMP.CNTRID ) ) 
    AND 
    ( CNTRIMP.ETA <= :"ToDate" ) 
    AND 
    ( CNTRIMP.ETA >= :"FromDate" ) 
    AND 
    ( CNTR.CUSTID IN ('MEI001','MAC02') )
    Group by
     CNTR.CUSTID,CNTR.CNTRSIZE
    Order by 
    CNTR.CUSTORDNO
    ;
      

  8.   

    刚看下她们的手册,是一个公司做的一个基于oracle查询以及报表工具.
    强倒是强大,就是一大本书,全英文的.急用的时候才知E文的用处呵.
    我这边不急,倒是做报表的女生急啦.
    本人水平有限,所以只能一边找,一边问了.谢谢大家的回复,也请大家再想下,union all 现在还在试,也有报错,而且是报列数,但是却又不统计的,还要自己第行列数去加了去估计......
      

  9.   

    你这个SQL直接运行不会出错吗?怎么感觉分组有问题啊??
      

  10.   

    SELECT  --CNTR.CNTRID,
            --CNTR.CUSTORDNO,
            CNTR.CNTRSIZE, 
    --CTMSAMRD_PRDN.REVSTR(CNTR.CNTRNO),
    --CNTR.CNTRNO, 
    SUM(decode(CNTR.CNTRSIZE,20,1,0)) Ctrn20,
    SUM(decode(CNTR.CNTRSIZE,40,1,0)) Ctrn40,
    SUM(decode(CNTR.CNTRSIZE,45,1,0)) Ctrn45, 
    CNTR.CUSTID, 
             --CNTRIMP.CNTRID, 
             --CNTRIMP.ETA,
      --CNTRIMP.DISVSL, 
             --CNTRIMP.DVOYNO
    FROM 
    CTMSAMRD_PRDN.CNTR CNTR, CTMSAMRD_PRDN.CNTRIMP CNTRIMP
    WHERE 
    ( ( CNTR.CNTRID = CNTRIMP.CNTRID ) ) 
    AND 
    ( CNTRIMP.ETA <= :"ToDate" ) 
    AND 
    ( CNTRIMP.ETA >= :"FromDate" ) 
    AND 
    ( CNTR.CUSTID IN ('MEI001','MAC02') )
    Group by
     CNTR.CUSTID,CNTR.CNTRSIZE
    Order by 
    CNTR.CUSTORDNO
    ;你只按CNTR.CUSTID,CNTR.CNTRSIZE这2个字段分组,怎么查询的时候多出那么多字段,上面注释掉的字段都有问题,应该用聚集函数获取这些字段的值吧
      

  11.   

    出来了,用工具做出来的
    就是先找出来,
    然后工具里面有一个totals.算出来的.也是MM找出来的,工具嘛,实用就行
    呵呵,可以放心吃中饭啦谢谢大家!
      

  12.   

    duanzilin(寻) ( ) 信誉:120 
    你说得有道理,我也是个新手:),学习...不过看了下成功的工具生成的源代码:
    GROUP BY 
    CTMSAMRD_PRDN.REVSTR(CNTR.CNTRNO),
    CNTR.CNTRID, CNTR.CUSTORDNO, CNTR.CNTRSIZE,
    CNTR.CUSTID, CNTRIMP.CNTRID, CNTRIMP.ETA, CNTRIMP.DISVSL, CNTRIMP.DVOYNO
    ORDER BY CNTR.CUSTORDNO ASC
    确实我写的有些问题.还有就是其实我事先也没去搞清楚这些关系.:)
    但还是没有一步到位的查出你在SQL&PLUS中的效果,totals是自己在工具中加的.
    勉强得很,也在想怎么一步到位.
    谢谢你啦 duanzilin.
      

  13.   

    用sqlplus脚本执行下.语句如下:break on report
    compute sum of cnt20 on report
    compute sum of cnt40 on report
    compute sum of cnt45 on reportselect d.userid,nvl(a.cnt20,0) cnt20,
    nvl(b.cnt40,0) cnt40,
    nvl(c.cnt45,0) cnt45
    from
    (select userid,count(*) cnt20 from table
    group by userid where tons = 20) a,
    (select userid,count(*) cnt40 from table
    group by userid where tons = 40) b,
    (select userid,count(*) cnt45 from table
    group by userid where tons = 45) c,
    select distinct userid from table d
    where d.userid = a.userid(+)
    and d.userid = b.userid(+)
    and d.userid = c.userid(+)