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

SQL语句循环问题,在线急等!100分!
A表:
Aid type cname sname
B表:
Bid sname rank
C表(统计表):
Cid sname type1,type2,type3,type4


假设:
A表当天新增了1000笔客户数据,其中A.type = 1的100笔,A.type =2的300笔,A.type =3的500笔,A.type =4的100笔
B表里面当天b.rank=2的有20人,b.rank=1的有15人,b.rank=0的有5人,共40人
B表sname是来自于A表sname的

希望创建一个sql的作业,每天0点自动运行sql语句,实现:

1、把当天A表的1000笔客户数据分配出去,B表里面b.rank=2+b.rank=1的有35人参与客户分配,平均每个人可以分到1000/35个,b.rank=0的人不参与分配
2、A.type = 1的数据只能平均分配给b.rank=2的20人,意味着b.rank=2的人每人大约能分配到100/20个客户,剩下的从其它type值里面分配,分配方式均为随机分配
3、分配的方式为把b.sname的值写入a.sname
4、每个b.sname分配到的客户写入C表来作为统计日志

举例如下:
b.sname="john"的当天共分配到了100/20+900/35笔≈31笔数据(也就是A表1000笔数据里面有28笔的A.sname="john")
其中:数据分配到了A.type = 1的5笔(100/20=5),A.type = 2的9笔(300/35≈9),A.type = 3的14笔(500/35≈14),A.type = 4的3笔(100/35≈3)共约31笔
将sname="john"的type值对应的1,2,3,4写入C表对应的type1,type2,type3,type4


给出语句马上给分,谢谢!


------解决方案--------------------


  
 drop table a;
 drop table b;
 drop table c;


CREATE TABLE a(aid INT  PRIMARY KEY,[type] INT,sname NVARCHAR(50))
CREATE TABLE b(bid INT  PRIMARY KEY,sname NVARCHAR(50),[rank] INT)

CREATE TABLE c(cid INT IDENTITY(1,1)  PRIMARY KEY,[Type] int,sname NVARCHAR(50),objectId int);

GO

INSERT INTO [dbo].[a] ([aid],[type],[sname])
SELECT ((SELECT ISNULL(MAX(ocxa.[aid]),10) FROM a ocxa)+ROW_NUMBER() OVER ( ORDER BY GETDATE())) AS rId
,1,null FROM MASTER.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number<100;

INSERT INTO [dbo].[a] ([aid],[type],[sname])
SELECT ((SELECT ISNULL(MAX(ocxa.[aid]),10) FROM a ocxa)+ROW_NUMBER() OVER ( ORDER BY GETDATE())) AS rId
,2,null FROM MASTER.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number<300;

INSERT INTO [dbo].[a] ([aid],[type],[sname])
SELECT ((SELECT ISNULL(MAX(ocxa.[aid]),10) FROM a ocxa)+ROW_NUMBER() OVER ( ORDER BY GETDATE())) AS rId
,3,null FROM MASTER.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number<500;


INSERT INTO [dbo].[a] ([aid],[type],[sname])
SELECT ((SELECT ISNULL(MAX(ocxa.[aid]),0) FROM a ocxa)+ROW_NUMBER() OVER ( ORDER BY GETDATE())) AS rId
,4,null FROM MASTER.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number<100;


INSERT INTO [dbo].[b] ([bid],[sname],[rank])
SELECT ((SELECT ISNULL(MAX(ocxa.[bid]),0) FROM b ocxa)+ROW_NUMBER() OVER ( ORDER BY GETDATE())) AS rId
,'2_'+ltrim(NEWID()),2  FROM MASTER.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number<20;


INSERT INTO [dbo].[b] ([bid],[sname],[rank])
SELECT ((SELECT ISNULL(MAX(ocxa.[bid]),0) FROM b ocxa)+ROW_NUMBER() OVER ( ORDER BY GETDATE())) AS rId
,'1_'+ltrim(NEWID()),1  FROM MASTER