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

某鸟 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

该如何做呢???
...全文
195 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
某鸟 2004-12-28
  • 打赏
  • 举报
回复
真是求人不如求己!还是得自己作……不问了……
反正上头也不支持用什么简便啊,高效啊之类的……大不了我一个一个算!
某鸟 2004-12-27
  • 打赏
  • 举报
回复
我是请教decode+grouping+rollup汇总出上述结果(严格遵守上述格式)的方法……
某鸟 2004-12-27
  • 打赏
  • 举报
回复
汗!楼上又误会了……

我是请教decode+grouping+rollup汇总出上述结果的方法……
dlab 2004-12-27
  • 打赏
  • 举报
回复
用sqlplus的统计不就好了,老的DD就是好用

col money format 999,999,999
sum on money
某鸟 2004-12-25
  • 打赏
  • 举报
回复
union的方法好像搞定了,现请教decode+grouping+rollup的方法……
是解决这个问题(显示上述结果)的方法,并非是他们组合的用法~
某鸟 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>
某鸟 2004-12-24
  • 打赏
  • 举报
回复
因为实际上那个bigclass我是不打算显示的~
某鸟 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
  • 打赏
  • 举报
回复
把你要的正确的显示结果帖出来看看.
某鸟 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>
某鸟 2004-12-24
  • 打赏
  • 举报
回复
有没有人帮忙解释下上面的新问题啊?:(
某鸟 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
某鸟 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
.
.
.

加载更多回复(7)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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