每行中选择表中的TSQL随机值

每行中选择表中的TSQL随机值,sql,sql-server,random,Sql,Sql Server,Random,使用RAND函数或NEWID在每列中生成一个随机值,就像在一行中生成随机值一样。但是该值在每一行中重复相同的值 如何在每一行中为每一列生成一个随机值?我想在B1列中显示一个随机产品,它也在“102”组中。B2列相同,但产品不同。而下一排又是两种不同的产品等等。结果将显示每个产品行中来自同一组的2个替代产品 我的代码如下所示: DECLARE @B1 varchar(30) DECLARE @B2 varchar(30) SET @B1 = (SELECT TOP 1 ItemCode FROM

使用RAND函数或NEWID在每列中生成一个随机值,就像在一行中生成随机值一样。但是该值在每一行中重复相同的值

如何在每一行中为每一列生成一个随机值?我想在B1列中显示一个随机产品,它也在“102”组中。B2列相同,但产品不同。而下一排又是两种不同的产品等等。结果将显示每个产品行中来自同一组的2个替代产品

我的代码如下所示:

DECLARE @B1 varchar(30)
DECLARE @B2 varchar(30)
SET @B1 = (SELECT TOP 1 ItemCode FROM items WHERE items.Assortment IN (102) ORDER  BY RAND())
SET @B2 = (SELECT TOP 1 ItemCode FROM items WHERE items.Assortment IN (102) ORDER  BY NEWID())

SELECT ProdCode, ProdName, @B1 as B1, @B2 as B2
FROM Products
WHERE ProductGroup IN (102) --use IN so you can select multiple groups

谢谢

以下是一种使用while循环遍历表中的行的方法:

如果产品表上有ID列或其他内容,或将其插入临时表以处理计算,以下方法将有所帮助

    DECLARE @MaxRowID INT
    DECLARE @RowID INT
    DECLARE @RandomNum FLOAT

    SET @RowID = 1

    SELECT @MaxRowID = MAX(ID) FROM Products

    WHILE ( @RowID <= @MaxRowID )
        BEGIN

            SET @RandomNum = RAND()

            UPDATE Products
            SET RandomNum = @RandomNum
            WHERE ID = @RowID

            SET @RowID = @RowID + 1

        END

    SELECT * FROM #Test

    DROP TABLE #Test

您需要从主查询中添加一些内容,以便为每一行重新计算子查询-即:

SELECT 
    ProdCode, 
    ProdName, 
    (
        SELECT TOP 1 ItemCode 
        FROM items 
        WHERE items.Assortment IN (102) AND itemcode <> products.ProdCode
        ORDER BY NEWID(), products.ProdCode
    )
FROM Products
WHERE ProductGroup IN (102) 

将子查询添加到select而不是VARIABLE中这就是RAND的工作方式-它只计算一次。请参阅和了解其他想法。@Serpiton我以前尝试过,它仍然会给出相同的结果。@AaronBertrand谢谢,这很有帮助,但我不太清楚如何在我的情况下应用它。你能给我指一下正确的方向吗?谢谢我怀疑您的问题更多的是关于唯一ID,但是您可能会探索不同的方法来播种随机ID。选择AddressID,RANDAddressID作为SalesLT中的Random。[Address]Looping和SQL不是朋友。我对它没有太多问题,但是如果您处理的数据集足够大,它可能会有问题。是的,它应该使用一个子选择来参考主选择。我尝试了你的解决方案,结果是,它在第1行给出了一个正确的随机值,但每隔一行就为空。但是,我将itemcode products.ProdCode放在子选择的where中,这样就可以了。我已经编辑了你的答案,这样每个人都可以阅读这个问题的代码。