BOM穿透子项查询问题

zhongguohld 2012-12-17 11:42:15
原始表
父项ID 父项描述 子项ID 子项描述 用量 层
00-001 成品料号 01-001 半成品1 1 0
01-001 半成品1 05-001 原材料1 0.5 1
01-001 半成品1 01-002 半成品2 2 1
01-002 半成品2 06-001 原材料2 1 2
01-002 半成品2 06-002 原材料3 3 2

结果表
父项ID 父项描述 子项ID 子项描述 用量
00-001 成品料号 05-001 原材料1 0.5
00-001 成品料号 06-001 原材料2 2
00-001 成品料号 06-002 原材料3 6

如何穿透半成品直接取出原材料的用量
...全文
189 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_Nice 2012-12-17
  • 打赏
  • 举报
回复
;WITH CTE
AS
(
SELECT 父项ID,父项描述,子项ID,子项描述,CAST( 用量 AS NUMERIC(8,2)) AS 用量 ,层
FROM dbo.TB
WHERE 层= 0
UNION ALL
SELECT C.父项ID,C.父项描述,B.子项ID,B.子项描述,CAST(B.用量*C.用量 AS NUMERIC(8,2)) AS 用量,B.层
FROM CTE AS C
INNER JOIN TB B ON C.子项ID = B.父项ID
)

SELECT *
FROM CTE
WHERE 子项描述 LIKE '原材料%'

/*
00-001	成品料号	05-001	原材料1	0.50	1
00-001	成品料号	06-001	原材料2	2.00	2
00-001	成品料号	06-002	原材料3	6.00	2*/
-晴天 2012-12-17
  • 打赏
  • 举报
回复
create table tb(fID varchar(10),finfo nvarchar(10),sID varchar(10),sinfo nvarchar(10),num decimal(10,2),l int) insert into tb select '00-001','成品料号','01-001','半成品1',1,0 insert into tb select '01-001','半成品1','05-001','原材料1',0.5,1 insert into tb select '01-001','半成品1','01-002','半成品2',2,1 insert into tb select '01-002','半成品2','06-001','原材料2',1,2 insert into tb select '01-002','半成品2','06-002','原材料3',3,2 go ;with cte as( select * from tb a where not exists(select 1 from tb where fid=a.sid) union all select a.fid,a.finfo,b.sid,b.sinfo,convert(decimal(10,2),a.num*b.num),a.l from tb a inner join cte b on a.sid=b.fid )select * from cte where l=0 /* fID finfo sID sinfo num l ---------- ---------- ---------- ---------- --------------------------------------- ----------- 00-001 成品料号 06-002 原材料3 6.00 0 00-001 成品料号 06-001 原材料2 2.00 0 00-001 成品料号 05-001 原材料1 0.50 0 (3 行受影响) */ go drop table tb
jiangshun 2012-12-17
  • 打赏
  • 举报
回复
--> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
GO
create table [TB]([父项ID] varchar(6),[父项描述] varchar(8),[子项ID] varchar(6),[子项描述] varchar(7),[用量] numeric(2,1),[层] int)
insert [TB]
select '00-001','成品料号','01-001','半成品1',1,0 union all
select '01-001','半成品1','05-001','原材料1',0.5,1 union all
select '01-001','半成品1','01-002','半成品2',2,1 union all
select '01-002','半成品2','06-001','原材料2',1,2 union all
select '01-002','半成品2','06-002','原材料3',3,2


WITH temp AS (
    SELECT * FROM TB t WHERE [父项ID]='00-001' union all
    SELECT t2.* FROM temp t INNER JOIN TB t2 ON t.[子项ID]=t2.[父项ID]
)
select * from temp t WHERE [子项ID] not IN(
SELECT [父项ID] from TB
)

/*
父项ID   父项描述     子项ID   子项描述    用量                                      层
------ -------- ------ ------- --------------------------------------- -----------
01-001 半成品1     05-001 原材料1    0.5                                     1
01-002 半成品2     06-001 原材料2    1.0                                     2
01-002 半成品2     06-002 原材料3    3.0                                     2

(3 行受影响)


*/

drop table [TB]

22,207

社区成员

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

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