♣
求一存储过程,估计有点难度,如果成功了会加分的,请高手来解决一下,谢谢
表是这样的:
表1:
id name
01 a
02 b
03 c
0101 a_a
0102 a_b
0102 a_c
0102001 a_c_a
0101001 a_a_a
0101002 a_a_b
0201 b_a
0201001 b_a_a
0202 b_b
0202002 b_b_a
0301 c_a
0301001 c_a_a
...
特征:a_a,a_b 是a的下一级,a_a_a是a_a的下一级,可以从id中看出规律来,b,c一样
表2:
id dates values1 values2
0301001 2005-1-1 1 2
0201001 2005-1-1 2 3
0301001 2005-1-2 3 4
0202002 2005-3-2 4 5
0101002 2005-2-3 5 6
0202002 2005-1-23 6 7
0102001 2005-2-1 8 9
0101001 2005-1-3 9 10
0101002 2005-4-5 3 54
0102002 2005-3-23 5 98
...
表2 是随机插入的数据,但id是表存在的。已定好各级的id长度如表1
现要得到这样的结果:
数据可按各级进行汇总,汇总时还要进行排序,汇总方式有二种。如:选择汇总方式:一级和二级汇总,按values1的汇总值降序排列,汇总2005-1-1 到2005-3-3的数据
得到结果:
name1 name2 value0 values1 values2
c c_a 1 4 6
c 小计 1 4 6
b b_a 2 2 3
b b_b 6 10 12
b 小计 8 12 15
a a_c 0 0 0
a a_b 8 8 9
a a_a 14 14 16
a 小计 22 22 25
value0的值是各二级下属单位在该时间段内最早日期的数据汇总。
注意排序:以小计(即一级)为组,先按小计(即一级)中values1的大小排序,然后在二级里按values1的大小排序。看例子,因为c 的小计比b和a的小计都要小,所以c所有的数据要在上面。
汇总的方式还可以是,一级和三级,所以是可变的。
不知道大家看懂了没有,请大家帮我解决一下,要求是存储过程。谢谢,成功后会加分的。
· 网友精彩回答:
这里,
0102 a_b
0102 a_c
0102001 a_c_a
是不是有错误??
怎么会都为0102??
另外,为0的第二级也要统计出来,是吧。
楼主:我想基本上明白你要做什么了。
但是还有几个问题:
question1:表1中怎么会出现id相同而name不同的情况?
即如游鱼所说, 下面数据中是是否存在笔误?
0102 a_b
0102 a_c
question2:结果表中name2为a_a这一行的记录有问题吧
应该为
name1 name2 value0 values1 values2
a a_a 9 17 70
question3:我们可不可以假定表1中, name列存在一个下划线,就表示一级?
即我想实际情况下name的值不可能只有a, b, c, 下划线组成。
可能是:食品_方便面_康师傅方便面 这类结构。所以我想问,如何从name的
值中看出级别关系。是不是可以假定下划线即为级别分隔符?
用这个应该可能解决问题
代码就自己写了吧
[ group by [ all ] group_by_expression [ ,...n ]
[ with { cube | rollup } ]
]
就是这两个参数 cube | rollup
你自己试试那一个是你要求的!
--建立测试环境
create table 表1
(id varchar(10),
name varchar(10))
create table 表2
(id varchar(10),
dates varchar(10),
values1 int,
values2 int)
--插入数据
insert 表1 values(01, a)
insert 表1 values(02, b)
insert 表1 values(03, c)
insert 表1 values(0101, a_a)
insert 表1 values(0102, a_b)
insert 表1 values(0103, a_c)
insert 表1 values(0103001, a_c_a)
insert 表1 values(0102001, a_b_a)
insert 表1 values(0101001, a_a_a)
insert 表1 values(0101002, a_a_b)
insert 表1 values(0201, b_a)
insert 表1 values(0201001, b_a_a)
insert 表1 values(0202, b_b)
insert 表1 values(0202002, b_b_a)
insert 表1 values(0301, c_a)
insert 表1 values(0301001, c_a_a)
insert 表2 values(0301001, 2005-1-1, 1, 2)
insert 表2 values(0201001, 2005-1-1, 2, 3)
insert 表2 values(0301001, 2005-1-2, 3, 4)
insert 表2 values(0202002, 2005-3-2, 4, 5)
insert 表2 values(0101002, 2005-2-3, 5, 6)
insert 表2 values(0202002, 2005-1-23, 6, 7)
insert 表2 values(0102001, 2005-2-1, 8, 9)
insert 表2 values(0101001, 2005-1-3, 9, 10)
insert 表2 values(0101002, 2005-4-5, 3, 54)
insert 表2 values(0102002, 2005-3-23, 5, 98)
--测试
select * from (
select
left(name,1) as name1,
left(name,3) as name2,
sum(values0) as values0,
sum(values1) as values1,
sum(values2) as values2
from
(select
a.name,
isnull(b.values1,0) as values0,
isnull(c.values1,0) as values1,
isnull(c.values2,0) as values2
from 表1 a
left join
(select id,min(values1) as values1 from 表2 where dates between 2005-1-1 and 2005-3-3 group by id ) b
on a.id=b.id
left join
(select id,sum(values1) as values1,sum(values2) as values2 from 表2 where dates between 2005-1-1 and 2005-3-3 group by id ) c
on a.id=c.id
where len(a.id)=(select max(len(id)) from 表1)) a
group by left(name,1),left(name,3)
with rollup) b
where name1 is not null
--删除测试环境
drop table 表1,表2
--结果
/*
name1 name2 values0 values1 values2
a a_a 14 14 16
a a_b 8 8 9
a a_c 0 0 0
a null 22 22 25
b b_a 2 2 3
b b_b 4 10 12
b null 6 12 15
c c_a 1 4 6
c null 1 4 6
*/
select isnull(dbo.表1.name, 总计) as name1, isnull(表1_1.name,
小计) as name2, sum(dbo.表2.values1) as values1, sum(dbo.表2.values2)
as values2
from dbo.表2 inner join
dbo.表1 on left(dbo.表2.id, 2) = dbo.表1.id inner join
dbo.表1 表1_1 on left(dbo.表2.id, 4) = 表1_1.id
where (dbo.表2.dates between 2005-1-1 and 2005-3-3)
group by dbo.表1.name, 表1_1.name with rollup
order by dbo.表1.name desc, 表1_1.name desc
- 更多问题:
- · 为什么我的本地程序一运行就会打开保存对话框,而无法运行?
- · DNS服务器端可以使用DNS服务,但客户端无法使用
- · 求助一个richtextbox的超连接问题(在线等)
- · DLL导出问题
- · 关于frame控件数组的问题,新添的页面覆盖了别的页面?
- · 各位大哥,小弟刚进入CSDN,请教一个小孩问题关于<mata>的
- · 当采用杀死进程的方法关闭程序时,程序会接受到什么消息?
- · 怎么把用SQL查询得到的所有不同的结果集整合在一起.
- · 关于动态控件的问题,高手进来看看,绝对不是很简单的问题!!!
- · 关于1950端口和Microsoft Virtual Machine 的问题
- · 用ASP怎样得到一个文件夹下的文件数目
- · 如何优化一个JPEG图像
- · PHP里>>>和===是什么意思?
- · 请各位帮忙看看这段ASP.NET中datagrid分页怎么不行?
- · 关于大段文章的还行问题
- · WEB系统在EXCEL中加载图片的问题,请高手赐教.
- · WebSphere专题
- · Eclipse函数 | Eclipse
- · 多媒体技术
- · WAP专题
- · XHTML技术文档 | XHTML
- · RedHat专题
- · bios升级
- · php后门
- · 龙域
- · 神域
- · borland codegear
- · borland app
- · 怎样备份
- · sql数据库备份
- · adsl拨号
- · adsl速度
- · 在R5的管理客户端,如何用server.id来签名设计元素
- · 全球知名3D设计软件行业盛会首度移师中国
- · 形象设计
- · 三维自然景观设计大师Vue 5 Esprit
- · 程序设计
- · Photoshop7.0之系统优化策略
- · 速成高手 Photoshop中文版数码全攻略
- · photoshop字体
- · firefox火狐浏览器

