2012-08-14 168 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