Sql server 将列值增加%范围

Sql server 将列值增加%范围,sql-server,Sql Server,我在SQL Server 2012中有一个表。以下查询非常有效: SELECT TOP 300 [ObjectID], [tbh_Objects].Title, [Discount], [tbh_Section].Title FROM [ECom].[dbo].[tbh_Objects] INNER JOIN [tbh_Section] ON tbh_Objects.SectionID = tbh_Section.SectionID ORDER BY tbh_Objects.AddedDat

我在SQL Server 2012中有一个表。以下查询非常有效:

SELECT TOP 300 [ObjectID], [tbh_Objects].Title, [Discount], [tbh_Section].Title
FROM [ECom].[dbo].[tbh_Objects] 
INNER JOIN [tbh_Section] ON tbh_Objects.SectionID = tbh_Section.SectionID 
ORDER BY tbh_Objects.AddedDate DESC
我想启动一个查询,一次将所有300行的折扣值增加到5-10范围内的随机百分比。例如:如果ObjectID=500的折扣是30,5到10之间的随机值是“6”,我希望ObjectID=500的折扣是30的30+6%

同样,对于objectid=230,假设折扣是20,随机值是8,我希望它是20的20+8%

折扣的最终结果应始终为整数,而不是小数,因此会自动四舍五入


这在SQL Server中可能吗?如何处理?

您需要随机整数和一个
模(%)
运算符。生成随机整数的一种可能方法是使用
NEWID()
CHECKSUM()函数的组合。以下简化示例是您的问题的可能解决方案:

SELECT 
   Discount,
   RandomPercent,
   CONVERT(int, (Discount * (100.0 + RandomPercent) / 100)) AS NewDiscount
FROM (
   SELECT Discount, (ABS(CHECKSUM(NEWID()) % 6) + 5) AS RandomPercent
   FROM (VALUES (30), (20), (50), (70), (11), (21), (13), (15), (1), (6)) v (Discount)
) t
结果:

Discount RandomPercent NewDiscount
----------------------------------
30        7            32
20        5            21
50        6            53
70        10           77
11        9            11
21        9            22
13        8            14
15        10           16
1         6            1
6         5            6
如果需要
更新
语句:

;WITH UpdateCTE AS ( 
   SELECT TOP 300 o.[Discount]
   FROM [ECom].[dbo].[tbh_Objects] o
   INNER JOIN [tbh_Section] s ON o.SectionID = s.SectionID 
   ORDER BY o.AddedDate DESC
) 
UPDATE UpdateCTE 
SET [Discount] = CONVERT(int, (o.[Discount] * (100.0 + (ABS(CHECKSUM(NEWID()) % 6) + 5)) / 100))
如果要在整数转换之前对新折扣进行四舍五入,请使用
round()


选择5+abs(cast(cast(newid()作为二进制(8))作为bigint))%100000000/1666667
是的,我刚刚更改了它。它还需要
abs()
来确保随机值为正值。
选择abs(校验和(NEWID())%6)+5
也是
校验和()
的一个选择。因为它返回一个
int
,所以使用它更容易,而且我认为随机性也没有问题。谢谢你的回复。我要300排的这个。计算时,您将折扣列放在哪里?还有,我如何使用更新命令来完成这项工作?太好了!您能否在UPDATE语句中演示如何执行此操作?我想一次更新300行的表,并用Newdiscount value更新折扣值“多次为Updatect指定了标题”。有什么线索吗?@CuriousDev这是因为您在CTE中有两列
Title
。如果只想更新
折扣
列,则删除它们,错误将消失。最后一个查询。我不想选择TOP 300,而是希望能够使用对象ID范围进行选择。比如说,更新对象ID在200到300之间的行。如何更新此查询以反映这一点?@CuriousDev 1)在
updatect
中使用适当的
WHERE
子句,类似于
WHERE ObjectID介于200和300之间的
2)删除
TOP
ORDER BY
子句。这应该足够了。
SET [Discount] = CONVERT(
   int, 
   ROUND(o.[Discount] * (100.0 + (ABS(CHECKSUM(NEWID()) % 6) + 5)) / 100, 0)
)