sql怎么写?
阶 品号 工艺价格 用量 物料单价
1 001 2
2 002 1 1.2
2 003 2 2.0
2 004 3 1
3 005 1 1.5
3 006 1 3
以上是BOM,我要计算001,004的成本。结果应该是
004 =1*1.5+1*3+3=7.5
001=1*1.2+2*2.0+7.5*1+2=14.7
这里的阶可能会有10级,不定,还有BOM会有很多,这里只举一个例子!
------解决方案----------------------测试过程:
--以下使用的是替归的方法,注意:在SQL里面最大的层数为32层。
SET NOCOUNT ON
CREATE TABLE T(阶 int,上级 nvarchar(10),品号 nvarchar(10),工艺价格 money,用量 int,物料单价 money)
INSERT INTO T
SELECT 1, NULL, '001 ',2,1,NULL UNION ALL
SELECT 2 , '001 ', '002 ',NULL,1,1.2 UNION ALL
SELECT 2 , '001 ', '003 ',NULL,2,2.0 UNION ALL
SELECT 2 , '001 ', '004 ',3,1,NULL UNION ALL
SELECT 3 , '004 ', '005 ',NULL,1,1.5 UNION ALL
SELECT 3 , '004 ', '006 ',NULL,1,3 UNION ALL
SELECT 2 , '001 ', '007 ',4,NULL,NULL UNION ALL
SELECT 3 , '007 ', '008 ',NULL,1,4
GO
--自定义函数
CREATE FUNCTION Fun_SumBomPrice(@ProcNo nvarchar(10),@Grade int)
RETURNS money AS
BEGIN
DECLARE @Return money
IF @Grade=1
SELECT @Return=SUM(ISNULL([工艺价格]*[用量],0)) FROM T WHERE [品号]=@ProcNo
ELSE
SELECT @Return=SUM(ISNULL([物料单价]*[用量],0)) FROM T WHERE [品号]=@ProcNo
--@Grade 最大的层次为32层
IF( @Grade <=10 AND EXISTS(SELECT 1 FROM T WHERE [上级]=@ProcNo))
SELECT @Return=@Return+dbo.Fun_SumBomPrice([品号],@Grade+1) FROM
(SELECT [品号] FROM T WHERE [上级]=@ProcNo) AS D
RETURN @Return
END
GO
PRINT '品号001: '+CAST(dbo.Fun_SumBomPrice( '001 ',1) AS nvarchar(20))
PRINT '品号004: '+CAST(dbo.Fun_SumBomPrice( '004 ',1) AS nvarchar(20))
DROP TABLE T
DROP FUNCTION Fun_SumBomPrice
GO
/*
结果:
------------------------
品号001: 15.70
品号004: 7.50
*/