27,579
社区成员
发帖
与我相关
我的任务
分享
IF OBJECT_ID('ta','u') IS NOT NULL
DROP TABLE ta
GO
IF OBJECT_ID('tb','u') IS NOT NULL
DROP TABLE tb
GO
IF OBJECT_ID('tc','u') IS NOT NULL
DROP TABLE tc
GO
/*
A表:
Aid type cname sname
B表:
Bid sname rank
C表(统计表):
Cid sname type1,type2,type3,type4*/
CREATE TABLE ta(
Aid INT IDENTITY(1,1),
type INT,
cname VARCHAR(10),
sname VARCHAR(10)
)
INSERT ta SELECT TOP 1000 CAST(RAND(CHECKSUM(NEWID())) * 4 + 1 AS INT),LEFT(NEWID(),10),''
FROM sys.objects,sys.columns
GO
CREATE TABLE tb(
bid INT IDENTITY(1,1),
sname VARCHAR(10),
brank INT)
GO
INSERT tb SELECT TOP 40 LEFT(NEWID(),10),CAST(RAND(CHECKSUM(NEWID())) * 3 + 1 AS INT)
FROM sys.objects
GO
CREATE TABLE tc
(
cid INT IDENTITY(1,1),
sname VARCHAR(10),
type1 INT,
type2 INT,
type3 INT,
type4 INT
)
GO
DECLARE @a INT,@b INT,@c INT
DECLARE @a1 INT,@b1 INT,@c1 INT
SELECT @a=COUNT(*) FROM ta WHERE type=1
SELECT @b=COUNT(*) FROM tb WHERE brank=2
SELECT @c=(@a+@b-1)/@b
SELECT @a1=COUNT(*) FROM ta WHERE type>1
SELECT @b1=COUNT(*) FROM tb WHERE brank>0
SELECT @c1=(@a1+@b1-1)/@b1
/*
上面这几行变量定义也可以不要,代到下面查询里,一条语句就可以出来,只是套进去写在下面的语句里显的繁琐,所以单独提出来
*/
SELECT Aid,type,cname,bid,b.sname,brank FROM
(
SELECT *,idx=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM ta WHERE type = 1
)a,
(
SELECT *,idx=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM tb WHERE brank=2
)b
WHERE (a.idx + @c-1)/@c= b.idx
UNION ALL
SELECT Aid,type,cname,bid,b.sname,brank FROM
(
SELECT *,idx=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM ta WHERE type >1
)a,
(
SELECT *,idx=ROW_NUMBER() OVER(ORDER BY NEWID()) FROM tb WHERE brank>0
)b
WHERE (a.idx + @c1-1)/@c1=b.idx
SELECT @@ROWCOUNT
/*
1000
上面的结果集就是你要插入到c表的数据, 然后联表把a表更新即可
*/
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.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number<15;
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
,'0_'+ltrim(NEWID()),0 FROM MASTER.dbo.spt_values sv WHERE sv.[type]='P' AND sv.number<5;
PRINT '---------------'
IF OBJECT_ID('tempdb..#b') IS NOT NULL
BEGIN
DROP TABLE #b
END
SELECT * INTO #b FROM b WHERE b.[rank]=2;
DECLARE @acount INT=0;
DECLARE @bcount INT=0;
SET @acount=(SELECT COUNT(1) FROM a WHERE a.type=1 AND a.sname IS NULL )
SET @bcount=(SELECT COUNT(1) FROM b WHERE b.[rank]=2)
--SELECT ((@acount+@bcount-1)/@bcount);--总页数
/*平均分配*/
;with tx as(
SELECT a.*,b.bid,b.sname AS snameNew FROM (
SELECT a.*,ROW_NUMBER() OVER ( ORDER BY a.aid) Rn FROM a
where a.type=1 AND a.sname IS NULL
) a
INNER JOIN (
SELECT b.*,ROW_NUMBER() OVER ( ORDER BY r.number ,b.bid) Rn
FROM #b b
INNER JOIN (SELECT * FROM MASTER.dbo.spt_values sv
WHERE sv.[type]='P'
AND sv.number<((@acount+@bcount-1)/@bcount))
r ON 1=1
) b ON a.Rn=b.Rn
)
UPDATE tx SET sname=snameNew
OUTPUT INSERTED.type,INSERTED.sname,INSERTED.aid INTO c;--select * from tx;
TRUNCATE TABLE #b;
INSERT INTO #b SELECT * FROM b WHERE b.[rank] IN(1,2);
SET @acount=(SELECT COUNT(1) FROM a WHERE a.type<>1 AND a.sname IS NULL )
SET @bcount=(SELECT COUNT(1) FROM b WHERE b.[rank] in(1,2))
/*随机分配*/
;with tx as(
SELECT a.*,b.bid,b.sname AS snameNew FROM (
SELECT a.*,ROW_NUMBER() OVER ( ORDER BY a.aid) Rn FROM a
WHERE a.type<>1 AND a.sname IS NULL
) a
INNER JOIN (
SELECT b.*,ROW_NUMBER() OVER ( ORDER BY NEWID()) Rn FROM #b b
INNER JOIN (SELECT * FROM MASTER.dbo.spt_values sv
WHERE sv.[type]='P'
AND sv.number<((@acount+@bcount-1)/@bcount))
r ON 1=1
) b ON a.Rn=b.Rn
)--SELECT * FROM tx ORDER BY bid;
UPDATE tx SET sname=snameNew
OUTPUT INSERTED.type,INSERTED.sname,INSERTED.aid INTO c;--select * from tx;
SELECT c.sname
,count(CASE WHEN c.type=1 THEN 1 END) type1
,count(CASE WHEN c.type=2 THEN 1 END) type2
,count(CASE WHEN c.type=3 THEN 1 END) type3
,count(CASE WHEN c.type=4 THEN 1 END) type4
,COUNT(1) ct
FROM c GROUP BY c.sname;
--1. MASTER.dbo.spt_values sv 此表,请楼主 自行 替换 成 Nums辅助表。
--2.修改了楼主的 C表(统计表)的表结构。