sql server查询为每半行分配2个不同的列值

时间:2014-05-12 07:49:36

标签: sql-server divide

我的下表有三列:

TB1

userID   itemID   rating

此表包含有关用户对不同项目的评分的信息。 用户可以对多个项目进行评级,并且项目可以从多个用户接收评级。

我需要更新此表的评级值,以便tb1中的一半应分配5评级,另一半应评为1评级。< / p>

注意:这意味着,虽然用户可以为不同的商品提供不同的评分,但商品的所有评级均为1或所有评级为5。

最初,所有用户和项目对的评级值均为NULL。

可以使用两个单独的查询执行此任务。

 UPDATE tb1
    SET rating = 5 
  WHERE itemID IN 
        (SELECT top(50) percent itemID
           FROM tb1 
          GROUP BY itemID
          ORDER BY newid());

 UPDATE tb1
    SET rating = 1
  WHERE rating IS NULL

有没有办法将这些查询合并到一个查询中?

1 个答案:

答案 0 :(得分:4)

如果前半部分为1而下半部分为5分,则不表示是否重要。只有50%应该是每个。

如果没关系那么你可以这样做:

 UPDATE tb1
    SET rating =
        (CASE
             WHEN itemId <=
                  (SELECT MAX(itemID)
                     FROM 
                          (SELECT TOP (50) percent itemID
                             FROM tb1 
                            GROUP BY itemID
                            ORDER BY itemID
                          ) x
                  ) THEN 5
             ELSE 1
         END)

或者,如果您的记录没有任何已删除的项目,或者您并不严格关注50%,那么您可以简单地执行以下操作:

 UPDATE tb1
    SET rating = CASE
                     WHEN (itemID % 2) = 1 THEN 1
                     ELSE 5
                  END

这种方法的好处是你可以做这样的事情:

UPDATE tb1
   SET rating = 
       CASE (itemID % 5) 
            WHEN 1 THEN 1
            WHEN 2 THEN 7
            WHEN 3 THEN 10
            WHEN 4 THEN 40
            ELSE 5
        END