日期:2014-05-16  浏览次数:20602 次

先进先出的计算-详细见帖子

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(