分组,求和与统计的查询,急需.

Kevin_jun 2006-04-11 09:16:41
USERID ORDERID TONS
u001 o001 20
u001 o002 40
u001 o003 45
u002 o005 20
.... .... ..

类似有这样的表,如何查出每个用户TONS(只有三种,如上例)20的单有多少,40的多少,45的多少.
然后所有20的多少,40的多少,45的多少.
要求在Oracle Discover里查出,一次查询显示出来.
只是现在我的分类总计查不出.

请大家帮忙,一早来就有人在催了.
...全文
211 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_jun 2006-04-11
  • 打赏
  • 举报
回复
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.
Kevin_jun 2006-04-11
  • 打赏
  • 举报
回复
出来了,用工具做出来的
就是先找出来,
然后工具里面有一个totals.算出来的.也是MM找出来的,工具嘛,实用就行
呵呵,可以放心吃中饭啦

谢谢大家!
沝林 2006-04-11
  • 打赏
  • 举报
回复
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个字段分组,怎么查询的时候多出那么多字段,上面注释掉的字段都有问题,应该用聚集函数获取这些字段的值吧
沝林 2006-04-11
  • 打赏
  • 举报
回复
你这个SQL直接运行不会出错吗?怎么感觉分组有问题啊??
Kevin_jun 2006-04-11
  • 打赏
  • 举报
回复
刚看下她们的手册,是一个公司做的一个基于oracle查询以及报表工具.
强倒是强大,就是一大本书,全英文的.急用的时候才知E文的用处呵.
我这边不急,倒是做报表的女生急啦.
本人水平有限,所以只能一边找,一边问了.

谢谢大家的回复,也请大家再想下,union all 现在还在试,也有报错,而且是报列数,但是却又不统计的,还要自己第行列数去加了去估计......
Kevin_jun 2006-04-11
  • 打赏
  • 举报
回复
各位老大,我的源码如下,请看下是不是有什么冲突的地方.
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
;
sanoul 2006-04-11
  • 打赏
  • 举报
回复
没见过这种工具,up
沝林 2006-04-11
  • 打赏
  • 举报
回复
没用过这个工具,rollup 在8i之前就支持的,怎么这个工具到9i还连基本的功能都不能支持,实在不行就用union吧,使用union造成重复查询会降低很多效率
Kevin_jun 2006-04-11
  • 打赏
  • 举报
回复
真的不支持rollup,报同样的错,没在EUL中注册
这可如何是好呢?
bugchen888 2006-04-11
  • 打赏
  • 举报
回复
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
沝林 2006-04-11
  • 打赏
  • 举报
回复
不支持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?
Kevin_jun 2006-04-11
  • 打赏
  • 举报
回复
duanzilin(寻) ( )
老大,你给的在我的机器不行
我用的是oracle discover
版本9i的,你在sql&plus下的grouping在我的工具下不可用
报语法错误,说在EUL中找不到或是没注册.

应该如何做下一步?
沝林 2006-04-11
  • 打赏
  • 举报
回复
是这样吗?
SQL> select * from b;

USERID ORDERID TONS
-------------------- -------------------- ----------
u001 o001 20
u001 o002 40
u001 o003 45
u002 o004 40
u002 o005 45
u003 o006 20

6 rows selected

SQL>
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
Renkey 2006-04-11
  • 打赏
  • 举报
回复
用sqlplus脚本执行下.语句如下:

break on report
compute sum of cnt20 on report
compute sum of cnt40 on report
compute sum of cnt45 on report

select 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(+)

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧