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

... 같은 것을 할 수 있어야하지만, 나는 그들이 그룹으로 선택을 사용하는 예를 본 적이 집합과 결합 전에. 나는 단지 그것을 작동하게 만들 수 없다.

도움 주셔서 감사합니다.

+0

당신이 사용하는 SQL 서버의 버전은 무엇? 2000 년? 2005 년? 2008 년? –

+0

아래에서 귀하의 답변을 볼 수 있지만 어쨌든 이것을 업데이트하겠습니다. SQL Server 2008을 사용하고 있습니다. 고마워요. –

답변

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

고맙습니다. 나는 내일 직장에서 이것을 시도 할 것이다. –

+0

나는 오늘 밤 이것을 시험하기로 결정했으며 완벽하게 작동합니다. 귀하의 의견으로는,이 솔루션을 마이클과 비교할 때 이것을 달성하기위한 '적절한'방법이 있습니까? 두 사람 모두 '수락'응답을 줄 사람을 모르겠습니다. - 도와 줘서 고마워. –

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

감사합니다. 나는 내일 직장에서 이것을 시도 할 것이다. –

+0

나는 오늘 밤 이것을 시험하기로 결정했으며 완벽하게 작동합니다. 귀하의 의견으로는,이 솔루션을 Malk와 비교할 때 이것을 달성하는 '적절한'방법이 있습니까? 두 사람 모두 '수락'응답을 줄 사람을 모르겠습니다. - 도와 줘서 고마워. –

+1

@AnthonyGattuso 나는 그들이 기능적으로 동등하다고 믿는다; 차이점은 하위 선택과 CTE입니다. CTE는 일반적으로 하위 선택보다 선호되지만 Sql Server 2000 이하에서는 사용할 수 없습니다. 어떤 버전의 Sql을 사용하고 있었는지 확실하지 않아서 CTE를 사용하지 않았습니다 ... 그러나 CTE를 지원하는 Sql 2008을 사용하고 있기 때문에 Malk의 답변을 참조 할 것입니다. –