Sql server 将列值增加%范围
我在SQL Server 2012中有一个表。以下查询非常有效: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
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)
)