还是“小计”的问题……如何排序查询结果啊?

21bird 2004-12-24 04:07:28
例如:有表t1,
数据如下:
select * from t1;

BIGCLASS CENTER ND MONEY MEMO
-------------------- ------------------------- -------------------- ------ -----
市场 北京 2004-1 200
市场 北京 2004-2 400
新市场 天津 2004-1 300
新市场 天津 2004-2 500
新市场 上海 2004-1 100
5 rows selected

我现在的sql和结果是:

SELECT center, bigclass, nd, money, memo FROM T1
UNION
SELECT bigclass || '合计', '', '', SUM(money), '' FROM T1
GROUP BY bigclass
ORDER BY bigclass
CENTER BIGCLASS ND MONEY MEMO
------------------------- -------------------- -------------------- ---------- -----
北京 市场 2004-1 200
北京 市场 2004-2 400
上海 新市场 2004-1 100
天津 新市场 2004-1 300
天津 新市场 2004-2 500
市场合计 1200
新市场合计 1800

可是我想要的是:

CENTER BIGCLASS ND MONEY MEMO
------------------------- -------------------- -------------------- ---------- -----
北京 市场 2004-1 200
北京 市场 2004-2 400
市场合计 1200
上海 新市场 2004-1 100
天津 新市场 2004-1 300
天津 新市场 2004-2 500
新市场合计 1800

该如何做呢???
...全文
162 点赞 收藏 27
写回复
27 条回复
21bird 2004年12月28日
真是求人不如求己!还是得自己作……不问了……
反正上头也不支持用什么简便啊,高效啊之类的……大不了我一个一个算!
回复 点赞
21bird 2004年12月27日
我是请教decode+grouping+rollup汇总出上述结果(严格遵守上述格式)的方法……
回复 点赞
21bird 2004年12月27日
汗!楼上又误会了……

我是请教decode+grouping+rollup汇总出上述结果的方法……
回复 点赞
dlab 2004年12月27日
用sqlplus的统计不就好了,老的DD就是好用

col money format 999,999,999
sum on money
回复 点赞
21bird 2004年12月25日
union的方法好像搞定了,现请教decode+grouping+rollup的方法……
是解决这个问题(显示上述结果)的方法,并非是他们组合的用法~
回复 点赞
21bird 2004年12月25日
楼上朋友,你现在的结果看起来是正确的,可是有个问题……
比如:当我将“北京”换成“西藏”,你看结果……

SELECT Bigclass, Center, Nd, Money, Memo
FROM T1
UNION
SELECT Bigclass Bigclass, bigclass||'小计' AS Center, '' Nd, SUM(Money) Money, '' Memo
FROM T1
GROUP BY Bigclass
UNION
SELECT '' AS Bigclass , '合计' AS Center, '' Nd, SUM(Money) Money, '' Memo
FROM T1
ORDER BY Bigclass

BIGCLASS CENTER ND MONEY MEMO
-------------------- ------------------------- -------------------- ---------- -----
市场 市场小计 600
市场 西藏 2004-1 200 a
市场 西藏 2004-2 400
新市场 上海 2004-1 100 e
新市场 天津 2004-1 300 d
新市场 天津 2004-2 500
新市场 新市场小计 900
合计 1500
8 rows selected

----------------
都反了吧?:(
回复 点赞
liuyi8903 2004年12月24日
SQL> Select Bigclass, Center, Nd, Money, Memo
2 From T1
3 Union
4 Select Bigclass Bigclass, bigclass||'小计' As Center, '' Nd, Sum(Money) Money, '' Memo
5 From T1
6 Group By Bigclass
7 Union
8 Select '' As Bigclass , '合计' As Center, '' Nd, Sum(Money) Money, '' Memo
9 From T1
10 Order By Bigclass
11 ;

BIGCLASS CENTER ND MONEY MEMO
-------------------- ------------------------ ---------- ---------- ----------
市场 北京 2004-1 200
市场 北京 2004-2 400
市场 市场小计 600
新市场 上海 2004-1 100
新市场 天津 2004-1 300
新市场 天津 2004-2 500
新市场 新市场小计 900
合计 1500

8 行 已选择

SQL>
回复 点赞
21bird 2004年12月24日
因为实际上那个bigclass我是不打算显示的~
回复 点赞
21bird 2004年12月24日
上面的重复记录去掉就差不多了……
比如:
400 北京 市场
200 北京 市场 a
600 -_-#
500 天津 新市场
300 天津 新市场 d
100 上海 新市场 e
900 -_-#
1500 total

其实我实际想要的是:
400 北京 市场
200 北京 市场 a
600 市场小计
500 天津 新市场
300 天津 新市场 d
100 上海 新市场 e
900 新市场小计
1500 total
回复 点赞
liuyi8903 2004年12月24日
把你要的正确的显示结果帖出来看看.
回复 点赞
21bird 2004年12月24日
楼上误会了……我弄错了数据,不是要*2的~

我现在的实现是:
SELECT SUM(money), center,
DECODE(grouping(bigclass), 1, 'total', DECODE(grouping(memo), 1, '-_-#', bigclass)) bigclass, memo FROM T1
GROUP BY rollup(bigclass, memo, center)
SUM(MONEY) CENTER BIGCLASS MEMO
---------- ------------------------- -------------------- -----
400 北京 市场
400 市场
200 北京 市场 a
200 市场 a
600 -_-#
500 天津 新市场
500 新市场
300 天津 新市场 d
300 新市场 d
100 上海 新市场 e
100 新市场 e
900 -_-#
1500 total
13 rows selected


SELECT * FROM T1
BIGCLASS CENTER ND MONEY MEMO
-------------------- ------------------------- -------------------- ------ -----
市场 北京 2004-1 200 a
市场 北京 2004-2 400
新市场 天津 2004-1 300 d
新市场 天津 2004-2 500
新市场 上海 2004-1 100 e
5 rows selected


我想要的是根据bigclass汇总,但“合计”“小计”字样要写在center处。
可现在的结果却是……大家看到了,都成对了,应该是我写错了,可怎么处理呢?
回复 点赞
liuyi8903 2004年12月24日
注意:
我在sum()时就乘以二了.
回复 点赞
liuyi8903 2004年12月24日
SQL> Create Table t1(bigclass Varchar2(20), center Varchar2(20), nd Varchar2(10), money Number(5), memo Varchar2(10));

表被创建

SQL>
SQL> Insert Into t1 Values('市场','北京', '2004-1',200,'');

1 行 已插入

SQL> Insert Into t1 Values('市场','北京', '2004-2',400,'');

1 行 已插入

SQL> Insert Into t1 Values('新市场','天津', '2004-1',300,'');

1 行 已插入

SQL> Insert Into t1 Values('新市场','天津', '2004-2',500,'');

1 行 已插入

SQL> Insert Into t1 Values('新市场','上海', '2004-1',100,'');

1 行 已插入

SQL>
SQL> Select bigclass, center, nd,money ,memo From t1
2 Union
3 Select bigclass||'合计', '' As center, '' nd,Sum(money)*2,'' memo From t1 Group By bigclass
4 ;

BIGCLASS CENTER ND MONEY MEMO
------------------------ -------------------- ---------- ---------- ----------
市场 北京 2004-1 200
市场 北京 2004-2 400
市场合计 1200
新市场 上海 2004-1 100
新市场 天津 2004-1 300
新市场 天津 2004-2 500
新市场合计 1800

7 行 已选择

SQL>
回复 点赞
21bird 2004年12月24日
有没有人帮忙解释下上面的新问题啊?:(
回复 点赞
21bird 2004年12月24日
晕,可不是嘛,楼上眼尖……
回复 点赞
liuyi8903 2004年12月24日
我看楼主的合计结果并不是真正意义上的吧.好像都乘以2了是不是?
回复 点赞
tyrone98 2004年12月24日
SELECT center, bigclass, nd, money, memo FROM T1 ORDER BY bigclass COMPUTE sum(money) by bigclass
回复 点赞
21bird 2004年12月24日
上面的问题解决了……

可新问题又出现了……
我的表有个多数都是null的字段“memo”,如果我在汇总sql加入这个字段,
那么结果中的除了汇总数据之外的普通数据都变成双份的了……晕啊~
请教各位,这怎么搞定呢?
回复 点赞
beckhambobo 2004年12月24日
Using the GROUP BY CUBE Clause: Example
To return the number of employees and their average yearly salary across all possible combinations of department and job category, issue the following query on the sample tables hr.employees and hr.departments:

SELECT DECODE(GROUPING(department_name), 1, 'All Departments',
department_name) AS department_name,
DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job_id,
COUNT(*) "Total Empl", AVG(salary) * 12 "Average Sal"
FROM employees e, departments d
WHERE d.department_id = e.department_id
GROUP BY CUBE (department_name, job_id);

DEPARTMENT_NAME JOB_ID Total Empl Average Sal
------------------------------ ---------- ---------- -----------
Accounting AC_ACCOUNT 1 99600
Accounting AC_MGR 1 144000
Accounting All Jobs 2 121800
Administration AD_ASST 1 52800
.
.
.
All Departments ST_MAN 5 87360
All Departments All Jobs 107 77798.1308

回复 点赞
beckhambobo 2004年12月24日
Examples
In the following example, which uses the sample tables hr.departments and hr.employees, if the GROUPING function returns 1 (indicating a superaggregate row rather than a regular row from the table), then the string "All Jobs" appears in the "JOB" column instead of the null that would otherwise appear:

SELECT DECODE(GROUPING(department_name), 1, 'All Departments',
department_name) AS department,
DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job,
COUNT(*) "Total Empl", AVG(salary) * 12 "Average Sal"
FROM employees e, departments d
WHERE d.department_id = e.department_id
GROUP BY ROLLUP (department_name, job_id);

DEPARTMENT JOB Total Empl Average Sal
------------------------------ ---------- ---------- -----------
Accounting AC_ACCOUNT 1 99600
Accounting AC_MGR 1 144000
Accounting All Jobs 2 121800
Administration AD_ASST 1 52800
Administration All Jobs 1 52800
Executive AD_PRES 1 288000
Executive AD_VP 2 204000
Executive All Jobs 3 232000
Finance FI_ACCOUNT 5 95040
Finance FI_MGR 1 144000
Finance All Jobs 6 103200
.
.
.

回复 点赞
发动态
发帖子
基础和管理
创建于2007-09-28

7175

社区成员

9.5w+

社区内容

Oracle 基础和管理
社区公告
暂无公告