2012-08-14 118 views
3

下面的SELECT语句返回正确的数据。带有CASE,GROUP BY和HAVING的SQL UPDATE

SELECT stu.sc, stu.sn, COUNT(*) AS Total, 
    CASE 
     WHEN COUNT(*) = 3 Then 'Letter 1' 
     WHEN COUNT(*) = 4 Then 'Letter 2' 
     WHEN COUNT(*) = 5 Then 'Letter 3' 
     ELSE 'SARB' 
    END AS Letter 
FROM STU join att ON (stu.SC = att.SC and stu.SN = att.SN) 
WHERE att.al in ('c','t','u') 
GROUP by stu.sc, stu.sn 
HAVING COUNT(*) >= 3 

我需要执行基于该查询的更新,我似乎无法弄清楚。我在网上查看了多个与我需要的示例类似的示例,但我无法使其工作。我需要能够做这样的事情...

UPDATE stu 
SET stu.tru = 
    CASE 
    When COUNT(*) = 3 Then 'Letter 1' 
    When COUNT(*) = 4 Then 'Letter 2' 
    When COUNT(*) = 5 Then 'Letter 3' 
    ELSE 'SARB' 
    END 
FROM stu JOIN att 
    on (stu.sc = att.sc and stu.sn = att.sn) 
WHERE ATT.AL in ('c','t','u') 
GROUP BY stu.sc, stu.sn 
HAVING COUNT(*) >= 3 

我知道我不能使用GROUP BY和有直接的更新语句,但我看到他们用与集团选择的例子通过设置和加入之前。我无法让它工作。

感谢您的任何帮助。

+0

您正在使用什么版本的SQL服务器的? 2000? 2005年? 2008年? – 2012-08-14 23:48:26

+0

我在下面看到你的回复,但我会更新这个。我正在使用SQL Server 2008.谢谢。 – 2012-08-15 02:32:47

回答

2
WITH CTE AS (
    SELECT stu.sc, stu.sn, COUNT(*) AS Total, 
     CASE 
     WHEN COUNT(*) = 3 Then 'Letter 1' 
     WHEN COUNT(*) = 4 Then 'Letter 2' 
     WHEN COUNT(*) = 5 Then 'Letter 3' 
     ELSE 'SARB' 
     END AS Letter 
    FROM STU join att ON (stu.SC = att.SC and stu.SN = att.SN) 
    WHERE att.al in ('c','t','u') 
    GROUP by stu.sc, stu.sn 
    HAVING COUNT(*) >= 3 
) 
UPDATE stu 
SET stu.tru = cte.Letter 
FROM stu JOIN cte 
    on (stu.sc = cte.sc and stu.sn = cte.sn) 
+0

谢谢。我明天将在工作中尝试这个。 – 2012-08-15 02:29:50

+0

我决定今晚测试一下,它完美的工作。在你看来,当把这个解决方案与Michael的下面进行比较时,是否有更合适的方法来实现这一点?我不知道谁会给出“接受”的答案,因为他们都工作。 - 非常感谢你的帮助。 – 2012-08-15 04:05:00

4
UPDATE stu 
SET tru = sub.letter 
FROM 
    stu JOIN (
    SELECT stu.sc, stu.sn, 
     CASE 
      WHEN COUNT(*) = 3 THEN 'Letter 1' 
      WHEN COUNT(*) = 4 THEN 'Letter 2' 
      WHEN COUNT(*) = 5 THEN 'Letter 3' 
      ELSE 'SARB' 
     END AS Letter 
    FROM STU 
    JOIN att ON (stu.SC = att.SC AND stu.SN = att.SN) 
    WHERE att.al in ('c','t','u') 
    GROUP by stu.sc, stu.sn 
    HAVING COUNT(*) >= 3 
) sub ON stu.sc = sub.sc AND stu.sn = sub.sn 
+0

谢谢。我明天将在工作中尝试这个。 – 2012-08-15 02:34:05

+0

我决定今晚测试一下,它完美的工作。在你看来,当把这个解决方案与Malk的上面进行比较时,是否有更合适的方法来实现这一点?我不知道谁会给出“接受”的答案,因为他们都工作。 - 非常感谢你的帮助。 – 2012-08-15 04:08:12

+1

@AnthonyGattuso我相信他们在功能上是等同的;区别在于子选择与CTE。 CTE通常优于子选择,但是,它们在Sql Server 2000或更低版本中不可用。我不确定你使用的是哪个版本的Sql,所以我没有使用CTE ......但是因为你使用的Sql 2008支持CTE,所以我会选择Malk的答案。 – 2012-08-15 14:27:00