日期:2014-05-17  浏览次数:20598 次

国庆之前的一道难题,做好放假!
有一批记录,想将负数自动按照正数项目所含正数的比例分摊,如下:
细类 金额  
A 400
B -100
C -200
D 500

总正数:900 总负数:-300
组合成:
A 400+4/9*(-300)
B 500+5/9*(-300)


请问各位大侠,sql有头绪吗?




------解决方案--------------------
SQL code

这个?
SELECT NAME,NUM+NUM/(SELECT SUM(NUM) FROM ABC where NUM>0)*(SELECT SUM(NUM) FROM ABC where NUM<0) FROM ABC

------解决方案--------------------
探讨

B、C两项不需要显示了,因为它所属的负数要分摊到正数的项目里面。
而且不要用update啊,要用select,源数据不能进行修改。

------解决方案--------------------
SQL code


--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([细类] VARCHAR(1),[金额] INT)
INSERT [tb]
SELECT 'A',400 UNION ALL
SELECT 'B',-100 UNION ALL
SELECT 'C',-200 UNION ALL
SELECT 'D',500
--------------开始查询--------------------------

SELECT [细类],[金额]+[金额]*1.0/(SELECT SUM([金额]) FROM [tb] WHERE [金额]>0)*(SELECT SUM([金额]) FROM [tb] WHERE [金额]<0) 
FROM [tb] WHERE [金额]>0
----------------结果----------------------------
/* 
细类    (无列名)
A    266.666666666800
D    333.333333333500*/