日期:2014-05-18  浏览次数:20409 次

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
*/