当前位置: 代码迷 >> Sql Server >> 先进先出的计算-详细见帖子解决办法
  详细解决方案

先进先出的计算-详细见帖子解决办法

热度:44   发布时间:2016-04-24 18:32:58.0
先进先出的计算-详细见帖子

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,
  相关解决方案