类似问题:
http://community.csdn.net/Expert/topic/3345/3345635.xml?temp=7.154483E-02
http://community.csdn.net/Expert/topic/3345/3345635.xml?temp=7.154483E-02
解决方案 »
- 数据对比
- 求sql一个ip查询比较语句
- 如何知道一条记录的生成时间?指系统记录的时间。
- 讨论有关GUID的优劣
- power designer 使用?
- 请教SQL2005中架构的相关问题(Schema)
- MSSQL数据库导入到购买空间上的问题,急急急.
- 如何把SQL SERVER6.5的数据库改为SQL SERVER7.0的。是把6.5的数据改为7.0可以用的,谢谢!
- 如何把data.mdb 中的表 Tinfo_Base 复制到SqlServer上 使用语句
- 请问,可以不可以把表名作为一个变量,其中的字段可不可以呢?
- 如何解决含有特殊字符的文本数据插入问题
- 这样的汇总如何实现???????????
a.name,
sum(isnull(b.[time],0)) as Sum_Time
from tb1 a,tb2 b
where a.projectID=b.projectID
group by a.name
--写个处理函数
create function f_id(
)returns @re table(ProjectID int,level int,sid varchar(8000))
as
begin
declare @l int
set @l=0
insert @re select ProjectID,@l,right(10000+ProjectID,4)
from 表1
where ParentID=-1
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.ProjectID,@l,b.sid+'-'+right(10000+a.ProjectID,4)
from 表1 a,@re b
where a.ParentID=b.ProjectID and b.level=@l-1
end
return
end
go--调用函数实现查询
select a.Name,Sum_Time=sum(b.[Time])
from 表1 a,表2 b,f_id() c
where a.ProjcetID=b.ProjcetID
and b.ProjcetID=c.ProjcetID
group by a.Name
order by max(c.sid)
我执行了一下,不太对!只能得到一个顶级project的所有次级project的总时间,我还要所有顶级project的求和时间却没有能否把你的function解释一下?谢谢您麻烦您
bbb 就该是9.00吧?
from 表1 a,表2 b,(
select a_ProjectID=a.ProjectID,b_ProjectID=b.ProjectID,a.sid
from f_id() a,f_id() b
where b.sid+'-' like a.sid+'-%') c
where a.ProjectID=c.a_ProjectID
and b.ProjectID=c.b_ProjectID
group by a.Name
order by max(c.sid)
create table 表1(ProjectID int,ParentID int,Name varchar(10))
insert 表1 select 1,-1,'aaa'
union all select 2,-1,'bbb'
union all select 3,1,'aaa1'
union all select 4,1,'aaa2'
union all select 5,2,'bbb1'
union all select 6,2,'bbb2'
union all select 7,2,'bbb3'create table 表2(ID int,ProjectID int,Time decimal(10,2))
insert 表2 select 1,3,2.00
union all select 2,3,4.50
union all select 3,4,1.00
union all select 4,3,7.00
union all select 5,5,1.00
union all select 6,5,2.00
union all select 7,6,2.00
union all select 8,7,1.00
union all select 9,7,3.00
go--写个处理函数
create function f_id(
)returns @re table(ProjectID int,level int,sid varchar(8000))
as
begin
declare @l int
set @l=0
insert @re select ProjectID,@l,right(10000+ProjectID,4)
from 表1
where ParentID=-1
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.ProjectID,@l,b.sid+'-'+right(10000+a.ProjectID,4)
from 表1 a,@re b
where a.ParentID=b.ProjectID and b.level=@l-1
end
return
end
go--调用函数实现查询
select a.Name,Sum_Time=sum(b.[Time])
from 表1 a,表2 b,(
select a_ProjectID=a.ProjectID,b_ProjectID=b.ProjectID,a.sid
from f_id() a,f_id() b
where b.sid+'-' like a.sid+'-%') c
where a.ProjectID=c.a_ProjectID
and b.ProjectID=c.b_ProjectID
group by a.Name
order by max(c.sid)
go--删除测试
drop table 表1,表2
drop function f_id/*--测试结果aaa 14.50
aaa1 13.50
aaa2 1.00
bbb 9.00
bbb1 3.00
bbb2 2.00
bbb3 4.00(所影响的行数为 7 行)
--*/
select d.Name ,sum_time from
(select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,(select ProjectID,sum(Time)as tt from table2 group by ProjectID) b
where b.ProjectID=a.ProjectID group by a.ParentID
union all
select ProjectID as tt,sum(Time)as sum_time from table2 group by ProjectID) c,table1 d
where c.tt=d.ProjectID order by Name
Name Sum_Time
aaa 14.50
aaa1 13.50
aaa2 1.00
bbb 7.00
bbb1 3.00
bbb2 2.00
bbb3 4.00
谢谢您,看懂了你的SQL
Perfect!!
但是,
还想问你一下:如果我的顶级project和次级project的首字母是不一样,
我排序的时候还是希望:顶级的项目排在最前,次级的项目排在后面,然后再排起他的顶级项目以及他的次级的项目。这个order by怎么写呢?
ProjectID ParentID Name
1 -1 aaa
11 -1 bbb
3 1 cc-aaa
10 1 zz-aaa
12 11 dd-bbb
9 11 ff-bbb
7 11 ee-bbbtable2
ID ProjcetID Time
1 3 2.00
2 3 4.50
3 10 1.00
4 3 7.00
5 12 1.00
6 12 2.00
7 9 2.00
8 7 1.00
9 7 3.00 用你给我的sql语句
可得到Name sum_time
aaa 14.50
bbb 9.00
cc-aaa 13.50
dd-bbb 3.00
ee-bbb 4.00
ff-bbb 2.00
zz-aaa 1.00
但是根据次级的project跟在顶级的project后面的要求,要把cc-aaa和zz-aaa跟在aaa后面
Name sum_time
aaa 14.50
cc-aaa 13.50
zz-aaa 1.00
bbb 9.00
dd-bbb 3.00
ff-bbb 2.00
ee-bbb 4.00劳驾
我有点怀疑是否能实现但是挺急得
aaa
aaa-cc
aaa-zz
bbb
bbb-bb
bbb-ff
bbb-ee还要等试验过才知道
Name 的命名,在顶级project和次级project之间是没有任何联系的次级project的名字在实际中并不是以顶级project的名字作为末尾的。union是不是把两个数据集并起来的,并不是穿插进去的
次级project的名字在实际中并不是以顶级project的名字作为末尾的。
ff-bbb 2.00
ee-bbb 4.00我觉得ee-bbb应该在前的,以外,排列也对了
------------------Name 的命名,在顶级project和次级project之间是没有任何联系的
次级project的名字在实际中并不是以顶级project的名字作为末尾的。
--------------------------
我还是想请你列出几个具有代表性的Name出来
我想你的排列应该是对的Name sum_time
aaa 14.50
cccc 13.50
zzzz 1.00
bbb 9.00
dddd 3.00
ffff 2.00
eeee 4.00
aaa 14.50
cccc 13.50
zzzz 1.00
bbb 9.00
dddd 3.00
eeee 4.00
ffff 2.00
还有那个Name到底是怎么样的?怎么一次和一次都不同
你前面说,
------------------
从你给出的列子来看除了这个
ff-bbb 2.00
ee-bbb 4.00我觉得ee-bbb应该在前的,以外,排列也对了
------------------
我以为你解决了
大概我理解错了
--------------------------
我还是想请你列出几个具有代表性的Name出来
----------------------------所以我就列出了一些没有任何关系的name
Name sum_time
aaa 14.50
cc-aaa 13.50
zz-aaa 1.00
bbb 9.00
dd-bbb 3.00
ee-bbb 4.00
ff-bbb 2.00反转以后就可以达到了,
但我看不出你后面列出来的Name是什么意思
select d.Name ,sum_time from
(select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,(select ProjectID,sum(Time)as tt from table2 group by ProjectID) b
where b.ProjectID=a.ProjectID group by a.ParentID
union all
select ProjectID as tt,sum(Time)as sum_time from table2 group by ProjectID) c,table1 d
where c.tt=d.ProjectID order by reverse(Name)
ProjectID ParentID Name
1 -1 aaa
11 -1 bbb
3 1 cccc
10 1 zzzz
12 11 dddd
9 11 ffff
7 11 eeee table2 依然是:
ID ProjcetID Time
1 3 2.00
2 3 4.50
3 10 1.00
4 3 7.00
5 12 1.00
6 12 2.00
7 9 2.00
8 7 1.00
9 7 3.00按照sql语句,不管是order by reverse(name),还是order by name
得到的是
Name sum_name
aaa 14.50
bbb 9.00
cccc 13.50
dddd 3.00
eeee 4.00
ffff 2.00
zzzz 1.00
希望得到是
Name sum_time
aaa 14.50
cccc 13.50
zzzz 1.00
bbb 9.00
dddd 3.00
eeee 4.00
ffff 2.00
因为次级cccc,zzzz是顶级aaa下的,所以排列在aaa下
同样,dddd,eeee,ffff在bbb下
你看这样对不对?create table #tf
(projectid int primary key,
parentid int,
[Name] varchar(20),
sumtime float(5)
)
insert #tf
select d.projectid,d.parentid,d.Name ,sum_time
from
(select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,
(select ProjectID,sum(Time)as tt from table2 group by ProjectID) b
where b.ProjectID=a.ProjectID group by a.ParentID
union all
select ProjectID as tt,sum(Time)as sum_time from table2 group by ProjectID)
c,table1 d
where c.tt=d.ProjectID order by reverse(Name)update #tf set parentid=projectid where parentid=-1
go
select Name,sumtime from #tf order by parentid, sumtime desc
drop table #tf
还有,我觉得单单用Name来排序是错的,
应该是先
排ParentID,再排名,
这里还有一个问题?你这个表是几级了?
不会等一下搞出了两级的,你又说还有三级的吧
我会写成函数]
一开始我没有看懂
拖着 yjdn(无尽天空) 写了半天
渐渐有点懂
sql和sql server懂得不是很多,一直想找时间要补课推荐我一些好文章,好吗?To yjdn(无尽天空) :
我会先排ParentID,再排名
会改的-----------
这里还有一个问题?你这个表是几级了?
不会等一下搞出了两级的,你又说还有三级的吧
----------
这个我不懂
能不能解释一下?
不会等一下搞出了两级的,你又说还有三级的吧
----------
这个我不懂
能不能解释一下?
--------------------
我是说,你那表会不会是这样:
ProjectID ParentID Name
1 -1 a
2 1 b
3 2 c
那不变成三级的了?----------------------------
如果用我的办法来的话,在排序以前增加一个列
也就是,有父结点的,就父结点+原来的,
比如:dddd父结点是aaa
新列就是aaaddd,最后用这个列来排序就可以达到你要的效果了,
今晚有事,没空帮你了,
抱歉
这个是我刚想到的,没整理好,
我变了一个方法,表一转为这样
1 1 aaa
11 11 bbb
3 1 cccc
10 1 zzzz
12 11 dddd
9 11 ffff
7 11 eeeeorder by ParentID,Name 就可以得到你要的效果:
select c.Name,d.sum_Time from (select (case when ParentID>0 then ParentID else ProjectID end )as tt ,ProjectID ,Name from table1 ) c,
(select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,(select ProjectID,sum(Time)as tt from table2 group by ProjectID) b
where b.ProjectID=a.ProjectID group by a.ParentID
union all
select ProjectID as tt,sum(Time)as sum_time from table2 group by ProjectID) d
where c.tt=d.tt order by c.tt ,c.Name
需要改成where c.ProjectID=d.tt order by c.tt ,c.Name否则不对你写的SQL,恐怕都不能保证顶级的project name排列在次级的project前面
只能保证顶级和次级的project会排列在一块儿因为顶级project排在次级project前面,总时间总是顶级project最多,
所以我又把
where c.ProjectID=d.tt order by c.tt ,c.Name
改成了
where c.ProjectID=d.tt order by c.tt ,sum_Time descname的排列只能算了不知道我说的对不对?
我先要把ParentID排序,再根据Name来排序,也就是顶级在前,同一顶级的,再按Name来排,这不是你的要求吗?用你的数据我得到了你要的结果,
顺序是:
cccc
zzzz
daa顶级的project会排在次级的project后面
我的数据仅仅是用来测试
真实的数据会发生这样的问题的
顺序是:
cccc
daa
zzzz顶级的project会排在次级的project后面我的数据仅仅是用来测试
真实的数据会发生这样的问题的
where c.ProjectID=d.tt order by c.tt ,sum_Time desc
------------------------------------------------
呵呵,就错在这了,--------------------------------------
本来想叫你用这个方法:
--------------------
如果用我的办法来的话,在排序以前增加一个列
也就是,有父结点的,就父结点+原来的,
比如:dddd父结点是aaa
新列就是aaaddd,最后用这个列来排序就可以达到你要的效果了,
------------------------------------
但是这样的话,就会:
如:
1 tttt
11 aaaa
这样的父结点,不知道你是按数字来排还是字母来排?-----------------------------------------
另建议另开一帖,把你的问题描述清楚,请各位星星看看,必竟我也只有三个三角,
没有多大的自信:)
我必须去整理一下我觉得我必须找时间把sql系统学习一下
否则碰到问题后,去找,去问,浪费了不少时间拖了你一天
谢谢你也谢谢 zjcxc(邹建)
毕竟邹老大也是不断地学习,不断地领悟的我们有老大这样的榜样,就会不断长进。