+ -
当前位置:首页 → 问答吧 → 请教高手一SQL 分组排序的问题,谢谢!

请教高手一SQL 分组排序的问题,谢谢!

时间:2011-11-26

来源:互联网

现在有一组基础数据,想通过它添加一些合计汇总数据,但是排序好像不是很好解决,
请教各位高手指点迷津,谢谢!


分公司 部门

东莞东大区 直营店
东莞东大区电信组 电信厅
东莞西大区电信组 直营店
公司组织架构 直营店
公司组织架构 职能部门
华西大区 商超店


我想根据以上基础数据按分公司分组汇总数据,想得出来的数据结果格式为:

东莞东大区 直营店
东莞东大区合计 合计
东莞东大区电信组 电信厅
东莞西大区电信组 直营店
东莞西大区电信组合计 合计
公司组织架构 直营店
公司组织架构 职能部门
公司组织架构合计 合计
华西大区 商超店
华西大区合计 合计

作者: az_1613   发布时间: 2011-11-26

SQL code

select *
from(
    select company,dept,0 as flag from tb
    union all
    select company,'合计',1 from tb group by company
)t
order by company,flag

作者: AcHerat   发布时间: 2011-11-26

引用 1 楼 acherat 的回复:
SQL code

select *
from(
select company,dept,0 as flag from tb
union all
select company,'合计',1 from tb group by company
)t
order by company,flag



东莞东大区 直营店 0
东莞东大区 合计 1
东莞东大区电信组 电信厅 0
东莞东大区电信组 合计 1
东莞东大区电信组合计 合计 0
东莞东大区电信组合计 合计 1
东莞东大区合计 合计 0
东莞东大区合计 合计 1
东莞西大区 直营店 0
东莞西大区 合计 1
东莞西大区电信组 电信厅 0
东莞西大区电信组 合计 1
东莞西大区电信组合计 合计 0
东莞西大区电信组合计 合计 1
东莞西大区合计 合计 0
东莞西大区合计 合计 1
公司组织架构 直营店 0
公司组织架构 职能部门 0
公司组织架构 合计 1
公司组织架构合计 合计 0
公司组织架构合计 合计 1
华西大区 商超店 0
华西大区 合计 1


谢谢你, 但是我试了下得出的结果为以上这样了,麻烦再帮我看下哦

作者: az_1613   发布时间: 2011-11-26

引用 2 楼 az_1613 的回复:
引用 1 楼 acherat 的回复:
SQL code

select *
from(
select company,dept,0 as flag from tb
union all
select company,'合计',1 from tb group by company
)t
order by company,flag



东莞东大区 直营店 0
东莞东大区 ……


不好意思, 我是在一个临时表中操作的,我刚加了两遍了,现在试了可以了, 能否继续帮我看下,以上只是步骤一, 步骤二我又得根据部门分组汇总, 得出的结果放在以上结果集的最下面, 步骤三,总汇总(汇总各部门总汇总数据的总集)放在结果集的最后一行

麻烦高手帮我看下,谢谢了

作者: az_1613   发布时间: 2011-11-26

SQL code

--这个意思?

--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] (分公司 varchar(16),部门 varchar(8))
insert into [tb]
select '东莞东大区','直营店' union all
select '东莞东大区电信组','电信厅' union all
select '东莞西大区电信组','直营店' union all
select '公司组织架构','直营店' union all
select '公司组织架构','职能部门' union all
select '华西大区','商超店'

--开始查询
select rid=ROW_NUMBER() over (order by 分公司,flag),
分公司=(case when flag=1 then 分公司+'合计' else 分公司 end),部门 from (
    select *,0 as flag from [tb]
    union all
    select 分公司,ltrim(COUNT(1)),1 from [tb] group by 分公司
)t

--结束查询
drop table [tb]

/*
rid                  分公司                  部门
-------------------- -------------------- ------------
1                    东莞东大区                直营店
2                    东莞东大区合计              1
3                    东莞东大区电信组             电信厅
4                    东莞东大区电信组合计           1
5                    东莞西大区电信组             直营店
6                    东莞西大区电信组合计           1
7                    公司组织架构               直营店
8                    公司组织架构               职能部门
9                    公司组织架构合计             2
10                   华西大区                 商超店
11                   华西大区合计               1

(11 行受影响)


引用 3 楼 az_1613 的回复:
引用 2 楼 az_1613 的回复:
引用 1 楼 acherat 的回复:
SQL code

select *
from(
select company,dept,0 as flag from tb
union all
select company,'合计',1 from tb group by company
)t
order by company,flag


……

作者: geniuswjt   发布时间: 2011-11-26

递归查询啊

作者: ssp2009   发布时间: 2011-11-26

lz你自己先想清楚要怎样,否则就是浪费时间。
先摆个想要的结果试试。大概10行测试数据即可。

作者: geniuswjt   发布时间: 2011-11-26

SQL code
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([分公司] nvarchar(8),[部门] nvarchar(4))
Insert #T
select N'东莞东大区',N'直营店' union all
select N'东莞东大区电信组',N'电信厅' union all
select N'东莞西大区电信组',N'直营店' union all
select N'公司组织架构',N'直营店' union all
select N'公司组织架构',N'职能部门' union all
select N'华西大区',N'商超店'
Go
Select [分公司]=ISNULL([分公司],''),[部门]=CASE WHEN GROUPING([分公司])=1 THEN N'總合计' ELSE ISNULL([部门],N'合计') END ,CASE WHEN GROUPING([部门])=0 THEN 0 ELSE COUNT(*)  END AS con
from #T
GROUP BY [分公司],[部门] WITH rollup 

/*
分公司    部门    con
公司组织架构    直营店    0
公司组织架构    职能部门    0
公司组织架构    合计    2
东莞西大区电信组    直营店    0
东莞西大区电信组    合计    1
东莞东大区    直营店    0
东莞东大区    合计    1
东莞东大区电信组    电信厅    0
东莞东大区电信组    合计    1
华西大区    商超店    0
华西大区    合计    1
    總合计    6
    */

作者: roy_88   发布时间: 2011-11-26

引用 6 楼 geniuswjt 的回复:
lz你自己先想清楚要怎样,否则就是浪费时间。
先摆个想要的结果试试。大概10行测试数据即可。


A分公司 直营 
A分公司 商超 
A分公司 电信厅 
A分公司合计 合计
... 

B分公司 直营 
B分公司 商超 
B分公司 电信厅 
B分公司合计 合计


直营店合计 合计
商超合计 合计
电信厅合计 合计

总合计 合计

结果排序大概为这样子,刚才我试了一楼的兄弟的办法,得出来的结果有点串位了
东莞东大区 直营店
东莞东大区电信组 电信厅
东莞东大区电信组合计 合计
东莞东大区合计 合计

作者: az_1613   发布时间: 2011-11-26

SQL code
這樣?

use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([分公司] nvarchar(8),[部门] nvarchar(4))
Insert #T
select N'东莞东大区',N'直营店' union all
select N'东莞东大区电信组',N'电信厅' union all
select N'东莞西大区电信组',N'直营店' union all
select N'公司组织架构',N'直营店' union all
select N'公司组织架构',N'职能部门' union all
select N'华西大区',N'商超店'
Go
Select 
[分公司]=ISNULL([分公司],'')+CASE WHEN GROUPING([分公司])=1 THEN N'總合计' ELSE ISNULL([部门],N'合计') END ,
CASE WHEN GROUPING([部门])=0 THEN [部门] ELSE RTRIM(COUNT(*))  END AS con
from #T
GROUP BY [分公司],[部门] WITH rollup 

/*
分公司    con
公司组织架构直营店    直营店
公司组织架构职能部门    职能部门
公司组织架构合计    2
东莞西大区电信组直营店    直营店
东莞西大区电信组合计    1
东莞东大区直营店    直营店
东莞东大区合计    1
东莞东大区电信组电信厅    电信厅
东莞东大区电信组合计    1
华西大区商超店    商超店
华西大区合计    1
總合计    6
*/

作者: roy_88   发布时间: 2011-11-26

引用 9 楼 roy_88 的回复:
SQL code
這樣?

use Tempdb
go
--> -->

if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([分公司] nvarchar(8),[部门] nvarchar(4))
Insert #T
select N'东莞东大区',N'直营店' uni……


谢谢您,得出来的结果应该是 分公司的名字中不能加上部门名称, 而且总合计上面还要汇总出每个部门的合计数据
应该结果要像
A分公司      直营  
A分公司      商超  
A分公司      电信厅  
A分公司合计    合计

B分公司      直营  
B分公司      商超  
B分公司      电信厅  
B分公司合计     合计
直营店合计     合计
商超合计      合计
电信厅合计     合计
总合计       合计

作者: az_1613   发布时间: 2011-11-26