一道要求按比例更新数据问题的解答
2010-09-25 13:59
423 查看
QA要求帮忙将样例表中的数据按比例更新:
例如,要求按如下规则更新某列
50%的数据,更新为A
25%的数据,更新为B
20%的数据,更新为C
5%的数据, 更新为D
解决方案如下:
---示例数据表
DECLARE @PercentSetting TABLE
(Id INT IDENTITY PRIMARY KEY,
A INT,
Percentage NVARCHAR(50)
)
--循环插入1000条数据
DECLARE @I INT
SET @I=1
WHILE @I <= 1000
BEGIN
INSERT INTO @PercentSetting(A)
SELECT @I*100
SET @I=@I+1
END
--按比例更新-------------------
DECLARE @TempTable TABLE
(Id INT IDENTITY PRIMARY KEY,
KeyCol1 INT,
keyCol2 INT--可能需要多列主键字段
)
INSERT INTO @TempTable(KeyCol1)
SELECT
Id
FROM @PercentSetting
WHERE Percentage is null
ORDER BY NEWID()--随机排序
--先设置50%
UPDATE t
SET t.Percentage='A'
FROM @PercentSetting AS t
INNER JOIN @TempTable AS tt ON t.Id = tt.KeyCol1
WHERE tt.Id % 2 = 0
DELETE @TempTable
INSERT INTO @TempTable(KeyCol1)
SELECT
Id
FROM @PercentSetting
WHERE Percentage IS NULL
ORDER BY NEWID()--随机排序
--剩余50%的50%即为25%
UPDATE t
SET Percentage='B'
FROM @PercentSetting AS t
inner join @TempTable AS tt ON t.Id = tt.KeyCol1
WHERE tt.Id % 2 = 0
DELETE @TempTable
INSERT INTO @TempTable(KeyCol1)
SELECT
Id
FROM @PercentSetting
WHERE Percentage IS NULL
ORDER BY NEWID()--随机排序
--再剩余(25%)的1/5即为总数的5%
UPDATE t
SET Percentage = 'D'
FROM @PercentSetting AS t
INNER JOIN @TempTable AS tt ON t.Id = tt.KeyCol1
WHERE tt.Id % 5 = 0
--剩余的即为20%
UPDATE @PercentSetting
SET Percentage='C'
WHERE Percentage IS NULL
--验证结果
--验证结果
SELECT
Percentage,
COUNT(*) CountOf1000
FROM @PercentSetting
GROUP BY Percentage
Percentage CountOf1000
-------------------------------------------------- -----------
A 500
B 250
C 200
D 50
例如,要求按如下规则更新某列
50%的数据,更新为A
25%的数据,更新为B
20%的数据,更新为C
5%的数据, 更新为D
解决方案如下:
---示例数据表
DECLARE @PercentSetting TABLE
(Id INT IDENTITY PRIMARY KEY,
A INT,
Percentage NVARCHAR(50)
)
--循环插入1000条数据
DECLARE @I INT
SET @I=1
WHILE @I <= 1000
BEGIN
INSERT INTO @PercentSetting(A)
SELECT @I*100
SET @I=@I+1
END
--按比例更新-------------------
DECLARE @TempTable TABLE
(Id INT IDENTITY PRIMARY KEY,
KeyCol1 INT,
keyCol2 INT--可能需要多列主键字段
)
INSERT INTO @TempTable(KeyCol1)
SELECT
Id
FROM @PercentSetting
WHERE Percentage is null
ORDER BY NEWID()--随机排序
--先设置50%
UPDATE t
SET t.Percentage='A'
FROM @PercentSetting AS t
INNER JOIN @TempTable AS tt ON t.Id = tt.KeyCol1
WHERE tt.Id % 2 = 0
DELETE @TempTable
INSERT INTO @TempTable(KeyCol1)
SELECT
Id
FROM @PercentSetting
WHERE Percentage IS NULL
ORDER BY NEWID()--随机排序
--剩余50%的50%即为25%
UPDATE t
SET Percentage='B'
FROM @PercentSetting AS t
inner join @TempTable AS tt ON t.Id = tt.KeyCol1
WHERE tt.Id % 2 = 0
DELETE @TempTable
INSERT INTO @TempTable(KeyCol1)
SELECT
Id
FROM @PercentSetting
WHERE Percentage IS NULL
ORDER BY NEWID()--随机排序
--再剩余(25%)的1/5即为总数的5%
UPDATE t
SET Percentage = 'D'
FROM @PercentSetting AS t
INNER JOIN @TempTable AS tt ON t.Id = tt.KeyCol1
WHERE tt.Id % 5 = 0
--剩余的即为20%
UPDATE @PercentSetting
SET Percentage='C'
WHERE Percentage IS NULL
--验证结果
--验证结果
SELECT
Percentage,
COUNT(*) CountOf1000
FROM @PercentSetting
GROUP BY Percentage
Percentage CountOf1000
-------------------------------------------------- -----------
A 500
B 250
C 200
D 50
相关文章推荐
- 一道面试题的解答_骑士获得金币问题
- 关于批量数据更新的问题(C#高性能)
- DataGrid更新数据时的一系列问题的解决
- OleDbCommand更新数据的一些问题
- .net下更新blog数据大小问题
- ListView的数据更新问题
- 错误修正:多行所有数据重复,无法更新或删除问题,通常是在没有主键的情况下的表.
- DataGridView 多线程更新 数据 解决卡顿问题
- wpf 绑定数据无法更新ui控件可能存在的问题
- [笔记]关于fragment切换更新数据问题
- 关于pku一道期中考试题,老赵发起的问题(更新)
- 关于更新局部listview中数据的问题
- sqlite3更新数据库问题 SQL执行成功但数据库数据不改变
- C# 系统开发历程 经验总结及遇到问题 之 无法更新有效的 更新要求有效的 UpdateCommand
- Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答
- 解决SpringBoot更新数据到MySQL乱码问题
- 分布式程序防止多用户对同一数据更新问题
- ZOJ 1005题解 这题数据有点问题没有按照题目要求也能被AC,我无语了。
- 通过 JSP 直接往 JavaScript 程序中放数据。解答百度知道的一个问题。
- dataset更新数据的问题