先进先出的计算-详细见帖子
CREATE TABLE BounsPointIn ( ID uniqueidentifier, VIPMemberID uniqueidentifier, BounsPoint int, BalanceBP int, InDate datetime, ExpiryDate datetime ) CREATE TABLE BounsPointOut ( ID uniqueidentifier, VIPMemberID uniqueidentifier, BounsPoint int, OutDate datetime )如上两个表,是用来记录VIP的积分的进出表,进的表每笔分数都有有效期,过了有效期就无法使用了。
目前我想根据这2两张表计算出每笔分数进出时 这个VIP的剩余分数。
例如:当VIP买了第一件货,我们会给他加5000分,此时他的剩余分是5000,
过了几天,他又买了一批货,我们加了7000分,此时的剩余分数应该是12000.
后面再买货时,他使用了1W分,那么第一笔的分要扣除,第2比分要扣5000分,
目前我们是没有记录每笔分数进出库时的剩余积分的,我现在出报表需要算出每笔进出库时的剩余积分。
小弟SQL不咋的,求大侠帮忙。。
下面要做统计,得到如下结果
No. VIP InOrOut BounsPoint CurrentBalanceBP
1 VIP1 In 5000 5000
2 VIP1 In 7000 12000
3 VIP1 Out 10000 2000
------解决方案-------------------- 能不能贴点数据出来
------解决方案-------------------- 引用: CREATE TABLE [CRM].[VIPBonusPointIn]( [ID] [uniqueidentifier] NOT NULL, --PK [VIPMemberNO] varchar(255) NOT NULL, --VIP No [BonusPoint] [int] NOT NULL, --入库分 [BalanceBP] [int] NOT NULL, --这比分数剩余可用分 [InDate] [datetime] NOT NULL, --入库日期 [ExpiryDate] [datetime] NULL --这比分的到期日期 ) CREATE TABLE [CRM].[VIPBonusPointOut]( [ID] [uniqueidentifier] NOT NULL, [VIPMemberNO] varchar(255) NOT NULL, --VIP No [BonusPoint] [int] NOT NULL, --扣减分数 [OutDate] [datetime] NOT NULL --扣减日期 ) --关系表,采用的是先进先出 每次出库会记录扣减的是哪条进库记录,有可能一条出库关联多条进库 CREATE TABLE [CRM].[VIPBonusPointCorrelation]( [VIPBonusPointInID] [uniqueidentifier] NOT NULL, [VIPBonusPointOutID] [uniqueidentifier] NOT NULL ) 例如: INSERT INTO [CRM].[VIPBonusPointIn] VALUES('A76B6E49-F99A-42D7-B385-8EF384CB0BAD','vip1',5000,5000,'2013-12-2','2014-6-30') INSERT INTO [CRM].[VIPBonusPointIn] VALUES('7D3ADB95-C028-4301-A7EC-1CA8710C0BDB','vip1',7000,7000,'2013-12-3','2014-6-30') INSERT INTO [CRM].[VIPBonusPointIn] VALUES('763B83EF-843C-4050-8F4F-204A7F9B9F8F','vip1',6000,6000,'2013-12-3','2013-2-4') --由于扣减1W分,根据先进先出,并且还要判断ExpiryDate来扣除之前的5000分,再到7000的这一笔里扣除5000分,此时会更新7000的BalanceBP为2000分 --2013-12-4的分数已经过期,所以在扣减时这比分数扣除 INSERT INTO [CRM].[VIPBonusPointOut] VALUES('DCFF106E-B067-4100-821A-6143AE63F29A','vip1',10000,'2013-12-5') INSERT INTO [CRM].[VIPBonusPointOut] VALUES('A76B6E49-F99A-42D7-B385-8EF384CB0BAD','DCFF106E-B067-4100-821A-6143AE63F29A') INSERT INTO [CRM].[VIPBonusPointOut] VALUES('7D3ADB95-C028-4301-A7EC-1CA8710C0BDB','DCFF106E-B067-4100-821A-6143AE63F29A') --我需要算出每一笔出库时的的剩余积分 下面要做统计,得到如下结果 No. VIP InOrOut BounsPoint CurrentBalanceBP 1 VIP1 In 5000 5000 2 VIP1 In 7000 12000 3 VIP1 In 6000 18000 4 VIP1 Out 10000 2000 如描述还不清楚,请说出来,谢谢各位大侠了。对了,你用的sql server 2000,还是2005呢
------解决方案-------------------- 引用: SQL2008 你试试:
;with t as ( select *,ROW_NUMBER() over(order by @@servername) as rownum from crm.[VIPBonusPointIn] ), tt as ( select t1.id, t1.VIPMemberNO as vip, 'In' as InOrOut, t1.BonusPoint, SUM(t2.BonusPoint) CurrentBalanceBP from t t1 left join t t2 on t1.rownum >= t2.rownum group by t1.id,