SQL 父级递归相乘

greentree_qx 2014-11-07 05:05:44
Create table unit
(
matNo varchar(20) not null,
unitNo varchar(20) not null primary key(matNo,unitNo),
unitName varchar(20),
unitParentNo varchar(20),
unitNum int default 1
)
insert into unit
select '1001','001','箱','',1 union
select '1001','002','包','001',5 union
select '1001','003','袋','002',10 union
select '1002','001','盒','',1 union
select '1002','002','包','001',10 union
select '1002','003','支','002',12

我想要的结果为,查询条件为matNo='1001',unitNo='001',得到的结果为1*5*10=50
matNo='1001',unitNo='002',得到的结果为1*10 =10
使用SQL脚本实现,有知道的大神吗,帮帮看看
...全文
168 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
greentree_qx 2014-11-11
  • 打赏
  • 举报
回复
谢谢各位大神,已经可以了
习惯性蹭分 2014-11-07
  • 打赏
  • 举报
回复


use tempdb 
 Create table unit
(
matNo varchar(20) not null,
unitNo varchar(20) not null primary key(matNo,unitNo),
unitName varchar(20),
unitParentNo varchar(20),
unitNum int default 1
)
insert into unit
select '1001','001','箱','',1 union
select '1001','002','包','001',5 union
select '1001','003','袋','002',10 union
select '1002','001','盒','',1 union
select '1002','002','包','001',10 union
select '1002','003','支','002',12
  
  
declare @matno varchar(50),
        @unit varchar(30)
        
select @matno='1001',
       @unit='001'
  ;with getdown as
  (
   select matno,unitNO,unitParentno,1 as unitNum,1 as rn from unit
   where matno=@matno and unitno=@unit
   union all
   select b.matno,b.unitNO,b.unitParentno,a.unitNum*b.unitNum as unitNum,a.rn+1 as rn from getdown a
   join unit b on b.unitParentNO=a.unitno
   and b.matno=@matno
  )             
  select top 1 matno,unitnUm from getdown  order by rn desc
还在加载中灬 2014-11-07
  • 打赏
  • 举报
回复
如果是2005+可以用CTE 如果是2000,就要复杂点
;WITH CTE AS(
	SELECT T1.*,T1.unitNum Result,CAST(T1.unitNum AS VARCHAR(8000)) StrResult FROM unit T1 LEFT JOIN unit T2 ON T1.unitNo=T2.unitParentNo WHERE T2.matNo IS NULL
	UNION ALL
	SELECT T1.*,T1.unitNum*T2.Result,CAST(T1.unitNum AS VARCHAR(8000))+'*'+T2.StrResult FROM unit T1 JOIN CTE T2 ON T1.matNo=T2.matNo AND T1.unitNo=T2.unitParentNo
)
SELECT Result,StrResult+'='+CAST(Result AS VARCHAR(8000))StrResult FROM CTE WHERE matNo='1001'AND unitNo='001'
Tiger_Zhao 2014-11-07
  • 打赏
  • 举报
回复
WITH tree AS (
SELECT matNO,
unitNO,
Convert(varchar(100),unitNum) rExp,
unitNum rValue,
1 level
FROM unit
WHERE matNo='1001' AND unitNo='001' --查询条件

UNION ALL

SELECT u.matNO,
u.unitNO,
Convert(varchar(100), t.rExp+'*'+Convert(varchar(11),unitNum)) rExp,
u.unitNum * t.rvalue rValue,
t.level+1 level
FROM tree t
JOIN unit u
ON u.matNO = t.matNO
AND u.unitParentNO = t.unitNo
)
SELECT TOP 1
rExp+'='+Convert(varchar(11),rValue) result
FROM tree
ORDER BY level DESC

result
----------------
1*5*10=50

22,210

社区成员

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

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