请帮我看看如下问题(邹建一定要看看),几张表的联合查询问题(继续昨天的问题)

LunTanZeng 2004-06-30 08:58:31
请问有这样一个问题
系部表(xibu)
-----------------------------
dID dName dSubID
-----------------------------
01 XX大学 01
0102 信息学院 01

010201 电信系 0102
01020101 电信软件专业 010201
01020102 电信数据库专业 010201

010202 计算机应用系 0102
01020201 计算机应用CAD专业 010202
01020202 计算机应用软件专业 010202

010203 计算机理论系 0102
01020301 计算机理论教育专业 010203

010204 经济管理系 0102 ---新增一个系
010205 机电学院 0102 ---新增一个院,隶属信息学院
01020501 工业自动化系 010205
01020502 机械自动化系 010205
0102050201 机械制造专业 01020502
0102050202 机械设计专业 01020502
----------------------------------------------------------------
年月表(YearMonth)
----------------------------------------------------------------
Year Month
----------------------------------------------------------------
2000 1
2000 2
----------------------------------------------------------------
----------------------------------------------------------------
缴费表(jiaofei)
-------------------------------------------------------------
ID dID Year month Money
-------------------------------------------------------------
1111 01020101 2000 1 5000.00
1111 01020101 2000 2 5000.00
1111 01020102 2000 1 5000.00
1111 01020102 2000 2 5000.00

1112 01020201 2000 1 5000.00
1112 01020201 2000 2 5000.00
1112 01020202 2000 1 5000.00
1112 01020202 2000 2 5000.00

1113 01020301 2000 1 5000.00
1113 01020301 2000 2 5000.00
1113 01020301 2003 3 5000.00
1113 01020301 2003 4 5000.00

1114 010204 2000 1 5000.00
1114 010204 2000 2 5000.00
1114 010204 2003 3 5000.00
1114 010204 2003 4 5000.00

1116 01020501 2000 1 5000.00
1117 0102050201 2000 2 5000.00
1118 0102050202 2003 1 5000.00
1119 010205 2003 4 5000.00

....
----------------------------------------------------------------
如何得到下列的结果
----------------------------------------------------------------
dID dName Year Month total
----------------------------------------------------------------
01 XX大学
01 XX大学 2000 1 0
01 XX大学 2000 1 0
01 小 计 0

0102 信息学院
0102 信息学院 2000 1 0
0102 信息学院 2000 1 0
0102 小 计 0


010201 电信系
010201 电信软件专业 2000 1 10000.0
010201 电信软件专业 2000 2 10000.0
010201 小 计 20000.0

010201 电信数据库专业 2000 1 10000.0
010201 电信数据库专业 2000 2 10000.0
010201 小 计 20000.0

...

010204 经济管理系
010204 经济管理系 2000 1 5000.0
010204 经济管理系 2000 2 5000.0
010204 小 计 10000.0

010205 机电学院
010205 工业自动化系 2000 1 5000.0
010205 工业自动化系 2000 2 0.0
010205 小 计 5000.0

010205 机械制造专业 2000 1 0
010205 机械制造专业 2000 2 5000.0
010205 小 计 5000.0

010205 机械设计专业 2000 1 5000.0
010205 机械设计专业 2000 2 0
010205 小 计 5000.0

-----------------------------------------------------------------
...全文
161 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LunTanZeng 2004-07-01
  • 打赏
  • 举报
回复
谢谢 邹建
在您的基础上我修改了两处,就是我要的答案。
感激ing..................................

给分了。
wangjiatom 2004-06-30
  • 打赏
  • 举报
回复
强啊 楼上的就是传说中的 周件 啊
zjcxc 2004-06-30
  • 打赏
  • 举报
回复

--测试

--测试数据
create table xibu(dID varchar(10),dName varchar(20),dSubID varchar(10))
insert xibu select '01' ,'XX大学', '01'
union all select '0102' ,'信息学院', '01'
union all select '010201' ,'电信系', '0102'
union all select '01020101' ,'电信软件专业', '010201'
union all select '01020102' ,'电信数据库专业', '010201'
union all select '010202' ,'计算机应用系', '0102'
union all select '01020201' ,'计算机应用CAD专业', '010202'
union all select '01020202' ,'计算机应用软件专业','010202'
union all select '010203' ,'计算机理论系', '0102'
union all select '01020301' ,'计算机理论教育专业','010203'
union all select '010204' ,'经济管理系', '0102'
union all select '010205' ,'机电学院', '0102'
union all select '01020501' ,'工业自动化系', '010205'
union all select '01020502' ,'机械自动化系', '010205'
union all select '0102050201','机械制造专业', '01020502'
union all select '0102050202','机械设计专业', '01020502'

create table jiaofei(ID int,dID varchar(10),[Year] int,[month] int,[Money] int)
insert jiaofei select 1111,'01020101' ,2000,1,5000.00
union all select 1111,'01020101' ,2000,2,5000.00
union all select 1111,'01020102' ,2000,1,5000.00
union all select 1111,'01020102' ,2000,2,5000.00
union all select 1112,'01020201' ,2000,1,5000.00
union all select 1112,'01020201' ,2000,2,5000.00
union all select 1112,'01020202' ,2000,1,5000.00
union all select 1112,'01020202' ,2000,2,5000.00
union all select 1113,'01020301' ,2000,1,5000.00
union all select 1113,'01020301' ,2000,2,5000.00
union all select 1113,'01020301' ,2003,3,5000.00
union all select 1113,'01020301' ,2003,4,5000.00
union all select 1114,'010204' ,2000,1,5000.00
union all select 1114,'010204' ,2000,2,5000.00
union all select 1114,'010204' ,2003,3,5000.00
union all select 1114,'010204' ,2003,4,5000.00
union all select 1116,'01020501' ,2000,1,5000.00
union all select 1117,'0102050201',2000,2,5000.00
union all select 1118,'0102050202',2003,1,5000.00
union all select 1119,'010205' ,2003,4,5000.00

create table YearMonth([Year] int,[Month] int)
insert YearMonth select 2000,1
union all select 2000,2
go

--查询
select dSubID=case grouping(b.[Year]) when 1 then '' else b.dSubID end
,dName=case grouping(b.[Year]) when 1 then '小计' else b.dName end
,[Year]=case grouping(b.[Year]) when 1 then '' else cast(b.[Year] as varchar) end
,[Month]=case grouping(b.[Year]) when 1 then '' else cast(b.[Month] as varchar) end
,total=isnull(sum(ab.[Money]),0)
from jiaofei ab
right join(
select a.dID,a.dSubID,a.dName,b.[Year],b.[month]
from xibu a,YearMonth b
where len(a.dSubID)<=6
group by a.dID,a.dSubID,a.dName,b.[Year],b.[month]
)b on ab.[Year]=b.[Year]
and ab.[month]=b.[month]
and ab.dID like b.dID
group by b.dID,b.dSubID,b.dName,b.[Year],b.[Month] with rollup
having grouping(b.dName)=0 and(
grouping(b.[Month])=0 or grouping(b.[Year])=1)
go

--删除测试
drop table YearMonth,jiaofei,xibu

/*--测试结果

结果你自己测试看
--*/


zjcxc 2004-06-30
  • 打赏
  • 举报
回复

--测试

--测试数据
create table xibu(dID varchar(10),dName varchar(20),dSubID varchar(10))
insert xibu select '01' ,'XX大学', '01'
union all select '0102' ,'信息学院', '01'
union all select '010201' ,'电信系', '0102'
union all select '01020101' ,'电信软件专业', '010201'
union all select '01020102' ,'电信数据库专业', '010201'
union all select '010202' ,'计算机应用系', '0102'
union all select '01020201' ,'计算机应用CAD专业', '010202'
union all select '01020202' ,'计算机应用软件专业','010202'
union all select '010203' ,'计算机理论系', '0102'
union all select '01020301' ,'计算机理论教育专业','010203'
union all select '010204' ,'经济管理系', '0102'
union all select '010205' ,'机电学院', '0102'
union all select '01020501' ,'工业自动化系', '010205'
union all select '01020502' ,'机械自动化系', '010205'
union all select '0102050201','机械制造专业', '01020502'
union all select '0102050202','机械设计专业', '01020502'

create table jiaofei(ID int,dID varchar(10),[Year] int,[month] int,[Money] int)
insert jiaofei select 1111,'01020101' ,2000,1,5000.00
union all select 1111,'01020101' ,2000,2,5000.00
union all select 1111,'01020102' ,2000,1,5000.00
union all select 1111,'01020102' ,2000,2,5000.00
union all select 1112,'01020201' ,2000,1,5000.00
union all select 1112,'01020201' ,2000,2,5000.00
union all select 1112,'01020202' ,2000,1,5000.00
union all select 1112,'01020202' ,2000,2,5000.00
union all select 1113,'01020301' ,2000,1,5000.00
union all select 1113,'01020301' ,2000,2,5000.00
union all select 1113,'01020301' ,2003,3,5000.00
union all select 1113,'01020301' ,2003,4,5000.00
union all select 1114,'010204' ,2000,1,5000.00
union all select 1114,'010204' ,2000,2,5000.00
union all select 1114,'010204' ,2003,3,5000.00
union all select 1114,'010204' ,2003,4,5000.00
union all select 1116,'01020501' ,2000,1,5000.00
union all select 1117,'0102050201',2000,2,5000.00
union all select 1118,'0102050202',2003,1,5000.00
union all select 1119,'010205' ,2003,4,5000.00

create table YearMonth([Year] int,[Month] int)
insert YearMonth select 2000,1
union all select 2000,2
go

--查询
select b.dID
,dName=case grouping(b.[Year]) when 1 then '小计' else b.dName end
,[Year]=case grouping(b.[Year]) when 1 then '' else cast(b.[Year] as varchar) end
,[Month]=case grouping(b.[Year]) when 1 then '' else cast(b.[Month] as varchar) end
,total=isnull(sum(a.[Money]),0)
from jiaofei a
right join(
select dID=a.dSubID,a.dName,b.[Year],b.[month],dID1=a.dSubID+'%'
from xibu a,YearMonth b
where len(a.dSubID)<=6 and exists(
select 1 from jiaofei
where dID like a.dSubID+'%')
group by a.dSubID,a.dName,b.[Year],b.[month]
)b on a.[Year]=b.[Year]
and a.[month]=b.[month]
and a.dID like b.dID1
group by b.dID,b.dName,b.[Year],b.[Month] with rollup
having grouping(b.dName)=0 and(
grouping(b.[Month])=0 or grouping(b.[Year])=1)
go

--删除测试
drop table YearMonth,jiaofei,xibu

/*--测试结果

结果你自己测试看
--*/

zjcxc 2004-06-30
  • 打赏
  • 举报
回复
--查询
select b.dID
,dName=case grouping(b.[Year]) when 1 then '小计' else b.dName end
,[Year]=case grouping(b.[Year]) when 1 then '' else cast(b.[Year] as varchar) end
,[Month]=case grouping(b.[Year]) when 1 then '' else cast(b.[Month] as varchar) end
,total=isnull(sum(a.[Money]),0)
from jiaofei a
right join(
select dID=a.dSubID,a.dName,b.[Year],b.[month],dID1=a.dSubID+'%'
from xibu a,YearMonth b
where len(a.dSubID)<=6 and exists(
select 1 from jiaofei
where dID like a.dSubID+'%')
group by a.dSubID,a.dName,b.[Year],b.[month]
)b on a.[Year]=b.[Year]
and a.[month]=b.[month]
and a.dID like b.dID1
group by b.dID,b.dName,b.[Year],b.[Month] with rollup
having grouping(b.dName)=0 and(
grouping(b.[Month])=0 or grouping(b.[Year])=1)
zjcxc 2004-06-30
  • 打赏
  • 举报
回复
这家伙,怎么老喜欢在后台出报表?
victorycyz 2004-06-30
  • 打赏
  • 举报
回复

小计应该在前台(报表)处理,放到报表的分组页脚里。
LunTanZeng 2004-06-30
  • 打赏
  • 举报
回复
1.切分点是系一级
/*层次表示类属关系*/
AA
AA1
AA11
AA111
AA12
AA121
统计成
AA /*统计有多少dID=AA的*/
AA1 /*统计有多少dID=AA1的*/
AA11
AA111
AA12
AA121
分别统计,不汇总上级,也不逐级汇总?
但是汇总后的dID一定是AA的编号

系一级以上的也分别统计,不涉及系及以下的
如:
01 XX大学 2000 1 0
01 XX大学 2000 1 0
01 小 计 0

0102 信息学院 2000 1 0
0102 信息学院 2000 1 0
0102 小 计 0
zjcxc 2004-06-30
  • 打赏
  • 举报
回复
1.你到底要统计到什么明细程度? 统计到多少级?
2.你的统计只是汇总上级,还是逐级汇总?
LunTanZeng 2004-06-30
  • 打赏
  • 举报
回复
to 邹建:
好像结果不对!!
------------------------------------------------------
测试结果
------------------------------------------------------
01 XX大学 2000 1 35000
01 XX大学 2000 2 35000
01 小计 70000
01 信息学院 2000 1 35000
01 信息学院 2000 2 35000
01 小计 70000
0102 电信系 2000 1 35000
0102 电信系 2000 2 35000
0102 小计 70000
0102 机电学院 2000 1 35000
0102 机电学院 2000 2 35000
0102 小计 70000
0102 计算机理论系 2000 1 35000
.....
--------------------------------------------------------
而我想要的结果是
--------------------------------------------------------
01 XX大学
01 XX大学 2000 1 0
01 XX大学 2000 1 0
01 小 计 0

0102 信息学院
0102 信息学院 2000 1 0
0102 信息学院 2000 1 0
0102 小 计 0


010201 电信系
010201 电信软件专业 2000 1 10000.0
010201 电信软件专业 2000 2 10000.0
010201 小 计 20000.0

010201 电信数据库专业 2000 1 10000.0
010201 电信数据库专业 2000 2 10000.0
010201 小 计 20000.0

...

010204 经济管理系
010204 经济管理系 2000 1 5000.0
010204 经济管理系 2000 2 5000.0
010204 小 计 10000.0
---------------------------------------------------------------
就是:
1.如果存在以XX大学交款的就统计它 统计以dID = 01缴费情况
2.如果存在以信息学院交款的就统计它 统计以dID = 01001缴费情况
3.如果是下列形式就这样统计
机电学院 统计以dID = 010205缴费情况
工业自动化系 统计以dID = 01020501 缴费情况
机械自动化系 统计以dID = 01020502 缴费情况
机械制造专业 统计以dID = 0102050201 缴费情况
机械设计专业 统计以dID = 0102050202 缴费情况

显示
----------------------------------------------------------------
dID dName Year Month total
----------------------------------------------------------------
01 XX大学 2000 1 0
01 XX大学 2000 1 0
01 小 计 0
/*因为没有dID=01 的缴费*/

0102 信息学院 2000 1 0
0102 信息学院 2000 1 0
0102 小 计 0
/*因为没有dID=0102 的缴费*/

010201 电信系 2000 1 0
010201 电信系 2000 2 0
/*因为没有dID=010201 的缴费*/

010201 电信软件专业 2000 1 10000.0
010201 电信软件专业 2000 2 10000.0
010201 小 计 20000.0
/*因为有dID = 01020101 的缴费,而且电信软件专业属于电信系 所以前面的 dID还是取电信系的dID,假设电信软件专业下面还有电信软件专业子专业,还是显示成这样:*/
010201 电信软件专业子专业 2000 1 0
010201 电信软件专业子专业 2000 2 0
010201 小 计 0
....
----------------------------------------------------------------
不知道我说清楚了吗???

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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