【发布时间】:2013-02-11 15:59:37
【问题描述】:
UPDATE Houses
SET lStatus = U.codesum
FROM Houses H
JOIN (SELECT ref, SUM(code) AS codesum
FROM Users
GROUP BY ref) AS U ON U.ref = H.ref
上面的代码获取每个房子的所有用户(Houses 表)。对所有用户的代码列(用户表)求和。最后更新房屋表的 lstatus 列中的结果。
我的问题是: 我需要重写不是对代码列求和的查询。相反,我想创建案例陈述。例如:
tempvar = 0 //local variable might be required
For each user {
If code == 1 then tempvar += 5
else if code == 2 then tempvar += 10
etc
tempvar = 0;
}
一旦我们遍历了每个房子的所有用户,我们现在可以设置 lStatus = tempvar。 然后应该将下一个房子的 tempvar 重置为 0。
【问题讨论】:
-
99% 的情况下,如果您认为 SQL Server 中存在“循环”,那么您的思维方式是错误的,并且有一个更好、更有效、基于集合的答案。我不会说总是/从不之类的话,但大多数时候这是非常可靠的。
-
99.9% 的情况下,有一种方法可以在不循环或使用光标的情况下获得所需的内容。我知道人们在你身上堆积如山,但这是一个防患于未然的坏习惯。这是另一个使用 UDF 解决小型企业问题的示例:granadacoder.wordpress.com/2008/07/24/…
标签: sql-server tsql loops sql-update sum