关于逐层累计的问题,请高手帮忙,谢谢

老农民77 2009-06-12 11:08:52
有这么一个结构的表tb:

代码 数据
---------------------------------------------------------------
0.01
0.01.01
0.01.01.01 100.00
0.01.02
0.01.02.01 100.00
0.01.02.02
0.01.02.02.01 100.00
0.01.02.02.02 100.00
0.01.03 100.00

表中的代码只有最末级才录有数据,现在需要实现逐层累加,直到最上级为止,实现的查询如下:

代码 计算结果
---------------------------------------------------------------
0.01 500.00
0.01.01 100.00
0.01.01.01 100.00
0.01.02 300.00
0.01.02.01 100.00
0.01.02.02 200.00
0.01.02.02.01 100.00
0.01.02.02.02 100.00
0.01.03 100.00

请大侠帮看看,谢谢!
...全文
54 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ai_li7758521 2009-06-12
  • 打赏
  • 举报
回复
貌似该这样:charindex(T.[代码],[代码])=1)
ai_li7758521 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fyzx77 的回复:]
SQL codeselect *,(select sum(isnull([数据],0)) from @tb where charindex(','+t.代码,','+代码)>0) as 计算结果
from @tb as t
这种写法速度快些,呵呵
[/Quote]这个有问题吧?
ai_li7758521 2009-06-12
  • 打赏
  • 举报
回复
CREATE TABLE TB ([代码] VARCHAR(13), [数据] INT)
INSERT TB
SELECT '0.01', null UNION ALL
SELECT '0.01.01', null UNION ALL
SELECT '0.01.01.01', 100.00 UNION ALL
SELECT '0.01.02', null UNION ALL
SELECT '0.01.02.01', 100.00 UNION ALL
SELECT '0.01.02.02', null UNION ALL
SELECT '0.01.02.02.01', 100.00 UNION ALL
SELECT '0.01.02.02.02', 100.00 UNION ALL
SELECT '0.01.03', 100.00

1.
SELECT *,(SELECT SUM([数据]) FROM TB WHERE [代码] LIKE T.[代码]+'%') AS 计算结果
FROM TB AS T
2.

SELECT *,(SELECT SUM([数据]) FROM TB WHERE charindex(T.[代码],[代码])=1) AS 计算结果
FROM TB AS T
老农民77 2009-06-12
  • 打赏
  • 举报
回复
select *,(select sum(isnull([数据],0)) from @tb where charindex(','+t.代码,','+代码)>0) as 计算结果 
from @tb as t

这种写法速度快些,呵呵
htl258_Tony 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fredrickhu 的回复:]
SQL code--改下4楼的
declare @tb table([代码] varchar(20), [数据] int)
insert @tb
select '0.01', null union all
select '0.01.01', null union all
select '0.01.01.01', 100.00 union all
select '0.01.02', null union all
select '0.01.02.01', 100.00 union all
select '0.01.02.02', null union all
select '0.01.02.02.01', 100.00 union all
select '0.01.02.02.02', 100.00 union all
select …
[/Quote]没发现改什么啊
htl258_Tony 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fyzx77 的回复:]
谢谢大家的回复,关键是性能怎样?大家看看哪种性能对大数据量处理合适?
[/Quote]
你自己有环境,比较一下就知道了。
sdhdy 2009-06-12
  • 打赏
  • 举报
回复
DECLARE @TB TABLE([代码] VARCHAR(13), [数据] INT)
INSERT @TB
SELECT '0.01', null UNION ALL
SELECT '0.01.01', null UNION ALL
SELECT '0.01.01.01', 100.00 UNION ALL
SELECT '0.01.02', null UNION ALL
SELECT '0.01.02.01', 100.00 UNION ALL
SELECT '0.01.02.02', null UNION ALL
SELECT '0.01.02.02.01', 100.00 UNION ALL
SELECT '0.01.02.02.02', 100.00 UNION ALL
SELECT '0.01.03', 100.00

SELECT *,(SELECT SUM([数据]) FROM @TB WHERE charindex('.'+T.[代码]+'.','.'+[代码]+'.')>0) AS 计算结果
FROM @TB AS T

/*
代码 数据 计算结果
------------- ----------- -----------
0.01 NULL 500
0.01.01 NULL 100
0.01.01.01 100 100
0.01.02 NULL 300
0.01.02.01 100 100
0.01.02.02 NULL 200
0.01.02.02.01 100 100
0.01.02.02.02 100 100
0.01.03 100 100

(所影响的行数为 9 行)
*/
老农民77 2009-06-12
  • 打赏
  • 举报
回复
谢谢大家的回复,关键是性能怎样?大家看看哪种性能对大数据量处理合适?
--小F-- 2009-06-12
  • 打赏
  • 举报
回复
--改下4楼的
declare @tb table([代码] varchar(20), [数据] int)
insert @tb
select '0.01', null union all
select '0.01.01', null union all
select '0.01.01.01', 100.00 union all
select '0.01.02', null union all
select '0.01.02.01', 100.00 union all
select '0.01.02.02', null union all
select '0.01.02.02.01', 100.00 union all
select '0.01.02.02.02', 100.00 union all
select '0.01.03', 100.00

select 代码,(select sum(isnull([数据],0)) from @tb where charindex(','+t.代码,','+代码)>0) as 计算结果
from @tb as t
/*
代码 计算结果
-------------------- ----------- -----------
0.01 500
0.01.01 100
0.01.01.01 100
0.01.02 300
0.01.02.01 100
0.01.02.02 200
0.01.02.02.01 100
0.01.02.02.02 100
0.01.03 100

(9 行受影响)
*/

sdhdy 2009-06-12
  • 打赏
  • 举报
回复
DECLARE @TB TABLE([代码] VARCHAR(13), [数据] INT)
INSERT @TB
SELECT '0.01', null UNION ALL
SELECT '0.01.01', null UNION ALL
SELECT '0.01.01.01', 100.00 UNION ALL
SELECT '0.01.02', null UNION ALL
SELECT '0.01.02.01', 100.00 UNION ALL
SELECT '0.01.02.02', null UNION ALL
SELECT '0.01.02.02.01', 100.00 UNION ALL
SELECT '0.01.02.02.02', 100.00 UNION ALL
SELECT '0.01.03', 100.00

SELECT *,(SELECT SUM([数据]) FROM @TB WHERE charindex(T.[代码],[代码])>0) AS 计算结果
FROM @TB AS T

/*
代码 数据 计算结果
------------- ----------- -----------
0.01 NULL 500
0.01.01 NULL 100
0.01.01.01 100 100
0.01.02 NULL 300
0.01.02.01 100 100
0.01.02.02 NULL 200
0.01.02.02.01 100 100
0.01.02.02.02 100 100
0.01.03 100 100

(所影响的行数为 9 行)
*/
qizhengsheng 2009-06-12
  • 打赏
  • 举报
回复
顶沟沟
--小F-- 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
SQL codeselect *
from tb where qty= (select sum(qty) from T as A where A.col1 like rtrim(T.col1)+'%')
and qty is null
[/Quote]
抄袭楼上的没抄袭对
select *
from tb A where qty= (select sum(qty) from tb as A where A.col1 like rtrim(T.col1)+'%')
and qty is null
htl258_Tony 2009-06-12
  • 打赏
  • 举报
回复
declare @tb table([代码] varchar(20), [数据] int)
insert @tb
select '0.01', null union all
select '0.01.01', null union all
select '0.01.01.01', 100.00 union all
select '0.01.02', null union all
select '0.01.02.01', 100.00 union all
select '0.01.02.02', null union all
select '0.01.02.02.01', 100.00 union all
select '0.01.02.02.02', 100.00 union all
select '0.01.03', 100.00

select *,(select sum(isnull([数据],0)) from @tb where charindex(','+t.代码,','+代码)>0) as 计算结果
from @tb as t
/*
代码 数据 计算结果
-------------------- ----------- -----------
0.01 NULL 500
0.01.01 NULL 100
0.01.01.01 100 100
0.01.02 NULL 300
0.01.02.01 100 100
0.01.02.02 NULL 200
0.01.02.02.01 100 100
0.01.02.02.02 100 100
0.01.03 100 100

(9 行受影响)
*/
--小F-- 2009-06-12
  • 打赏
  • 举报
回复
select *
from tb where qty= (select sum(qty) from T as A where A.col1 like rtrim(T.col1)+'%')
and qty is null
playwarcraft 2009-06-12
  • 打赏
  • 举报
回复

create table T(col1 varchar(50), qty int)
insert into T
select '0.01', null
union all select '0.01.01', null
union all select '0.01.01.01', 100.00
union all select '0.01.02' ,null
union all select '0.01.02.01', 100.00
union all select '0.01.02.02',null
union all select '0.01.02.02.01', 100.00
union all select '0.01.02.02.02' , 100.00
union all select '0.01.03' , 100.00


GO

Update T
set qty= (select sum(qty) from T as A where A.col1 like rtrim(T.col1)+'%')
where qty is null
Go
select * from T
/*
0.01 500
0.01.01 100
0.01.01.01 100
0.01.02 300
0.01.02.01 100
0.01.02.02 200
0.01.02.02.01 100
0.01.02.02.02 100
0.01.03 100

*/
GO
drop table T

csdyyr 2009-06-12
  • 打赏
  • 举报
回复
DECLARE @TB TABLE([代码] VARCHAR(13), [数据] INT)
INSERT @TB
SELECT '0.01', null UNION ALL
SELECT '0.01.01', null UNION ALL
SELECT '0.01.01.01', 100.00 UNION ALL
SELECT '0.01.02', null UNION ALL
SELECT '0.01.02.01', 100.00 UNION ALL
SELECT '0.01.02.02', null UNION ALL
SELECT '0.01.02.02.01', 100.00 UNION ALL
SELECT '0.01.02.02.02', 100.00 UNION ALL
SELECT '0.01.03', 100.00

SELECT *,(SELECT SUM([数据]) FROM @TB WHERE [代码] LIKE T.[代码]+'%') AS 计算结果
FROM @TB AS T
/*
代码 数据 计算结果
------------- ----------- -----------
0.01 NULL 500
0.01.01 NULL 100
0.01.01.01 100 100
0.01.02 NULL 300
0.01.02.01 100 100
0.01.02.02 NULL 200
0.01.02.02.01 100 100
0.01.02.02.02 100 100
0.01.03 100 100
警告: 聚合或其他 SET 操作消除了空值。

(9 row(s) affected)


*/

22,206

社区成员

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

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