是否可以根据其他列显示的内容更新表?

时间:2013-08-02 18:42:09

标签: sql sql-server sql-server-2008 sql-update case

想要这样做的原因是,我需要按照四种不同的方式对数据进行分组,但仍然需要将它们作为一个结果集返回。

例如。

我真的不能想到一个实际的例子,但在我正在做的事情中这是必要的。想象一下,如果我回来了水果,蔬菜,总统和体育,但我想将所有

分组

以他们的名字结合在一起 蔬菜的颜色 总统由他们的党和 他们的城市体育。 (好吧,我告诉过你我有一个不好的例子)

无论如何,我希望做的是GROUP BY我称之为'SubClass'的东西。为了做到这一点,'SubClass'将寻找'RuleClass'来确定它应该返回什么代码。这甚至可能吗?类似的东西...

 UPDATE #FakeTable
 SET SubClass = CASE WHEN RuleClass = 'Fruit' THEN H.NAME
                     WHEN RuleClass = 'Vegetables' THEN H.COLOR
                     WHEN RuleClass = 'President' THEN H.PARTY
                     ELSE H.City
                END
        FROM #Holdings H
        WHERE #FakeTable.SubClass = NULL

因此,该列将从另一个临时表中的另一列中取出,取决于感知列中的内容。

2 个答案:

答案 0 :(得分:0)

以下是样本:

UPDATE F
SET SubClass = (CASE WHEN RuleClass = 'Fruit' THEN H.NAME
                     WHEN RuleClass = 'Vegetables' THEN H.COLOR
                     WHEN RuleClass = 'President' THEN H.PARTY
                     ELSE H.City
                END)
FROM #Holdings H
JOIN #FakeTable F ON H.<COLUMNAME>=F.<COLUMNNAME>
WHERE F.SubClass = NULL

答案 1 :(得分:0)

您可以在case子句中包含group by语句:

select class,
       (case when WHEN RuleClass = 'Fruit' THEN H.NAME
                  WHEN RuleClass = 'Vegetables' THEN H.COLOR
                  WHEN RuleClass = 'President' THEN H.PARTY
                  ELSE H.City
        END) as subclass,
      count(*)
from t
group by (case when WHEN RuleClass = 'Fruit' THEN H.NAME
               WHEN RuleClass = 'Vegetables' THEN H.COLOR
               WHEN RuleClass = 'President' THEN H.PARTY
               ELSE H.City
          ENd);

您无需将其作为单独的字段添加到表中。