2014-11-04 2 views
0

저는 SQL과 루프가 새로 도입되어 다음과 같은 문제에 대한 도움이 필요합니다.SQL에서 루프를 사용하여 테이블 채우기 (SQL Server)

SpotID Over30 Over70 Over100 

123 3  2  1 
236 2  2  2 
69  2  2  1 

가 그래서 난 후 생각하는 횟수의 수입니다 :

SpotID EventID MaxTemp 

123 1 45 
236 1 109 
69  1 18 
123 2 216 
236 2 29 
69  2 84 
123 3 91 
236 3 457 
69  3 280 

나는 다음과 같은 출력을 가진 새로운 테이블을 생성하고 싶습니다 :

는이 같은 테이블이 있습니다 온도가 다른 EventID에 대해 SpotID 당 30, 70 및 100의 한계를 초과 했습니까?

루프를 사용하여이를 수행 할 수있는 방법이 있습니까? 내 데이터 세트는 분명히 더 커지고 내가 어떻게 효율적으로 사용할 수 있는지 궁금합니다.

대단히 감사합니다.

마이크

+0

어떤 DBMS가 있습니까? SQL 서버? 미스? –

+0

죄송합니다, 추가를 잊었습니다! 그것은 SQL 서버 – MikeB

답변

5

당신은 단지 조건부 집계를 필요는 :

select spotid, 
     sum(case when maxtemp > 30 then 1 else 0 end) as over_30, 
     sum(case when maxtemp > 70 then 1 else 0 end) as over_70 
     sum(case when maxtemp > 100 then 1 else 0 end) as over_100 
from likethis 
group by spotid; 
+0

고든 고든입니다! – MikeB

+0

대신 커서를 사용하여 버전을 수락하셨습니까? 당신은 당신이 원하는 답을 수락 할 수있는 특권을 가지고 있지만, 일반적으로 할 수 있으면 커서를 피해야합니다. –

0

이전 게시물에 하나의 작은 변화, 내 버전은 다른 낮은 임시 직원은 대부분의 임시 직원되지에서 임시 직원을 계산합니다, 각 온도 범위 내에서 계산 그 범위.

그냥 루프를 사용하는 방법을 배우고 싶다면
DECLARE @DATA TABLE (
    SpotID INT, 
    EventID INT, 
    MaxTemp INT 
    ) 

INSERT INTO @DATA VALUES 
    (123, 1, 45), 
    (236, 1, 109), 
    (69 , 1, 18), 
    (123, 2, 216), 
    (236, 2, 29), 
    (69 , 2, 84), 
    (123, 3, 91), 
    (236, 3, 457), 
    (69 , 3, 280) 

SELECT 
    SpotID, 
    SUM(CASE WHEN MaxTemp > 30 AND MaxTemp < 70 THEN 1 ELSE 0 END) AS OVER_30, 
    SUM(CASE WHEN MaxTemp >= 70 AND MaxTemp < 100 THEN 1 ELSE 0 END) AS OVER_70, 
    SUM(CASE WHEN MaxTemp >= 100 THEN 1 ELSE 0 END) AS OVER_100 
FROM 
    @DATA 
GROUP BY 
    SpotID 
+0

질문 PWS가 있습니까? –

+0

스티븐에게 답변 해 주셔서 감사합니다. 미안하지만 PWS가 무엇인지 알지 못해서 내가 두려워하지 않을 수 없습니다. – MikeB

+0

PWS = 개인 기상대. 나는 지난 5 년간 폭풍우 (90MPH 바람)가 돛대에서 내 역을 완전히 없애기 위해 날아 다니는 파편을 뽑을 때까지 지난 5 년간 광산에서 기상 데이터를 수집 해왔다. –

0

....

DECLARE @DATA TABLE (
    SpotID INT, 
    EventID INT, 
    MaxTemp INT 
    ); 

DECLARE @NEWDATA TABLE (
    SpotID INT, 
    T30 INT, 
    T90 INT, 
    T100 INT 
    ); 

DECLARE 
    @SPOT AS INT, 
    @T30 AS INT, 
    @T90 AS INT, 
    @T100 AS INT; 


INSERT INTO @DATA VALUES 
    (123, 1, 45), 
    (236, 1, 109), 
    (69 , 1, 18), 
    (123, 2, 216), 
    (236, 2, 29), 
    (69 , 2, 84), 
    (123, 3, 91), 
    (236, 3, 457), 
    (69 , 3, 280); 


DECLARE STATION CURSOR FOR SELECT SpotID FROM @DATA GROUP BY SpotID; 
OPEN STATION; 
FETCH NEXT FROM STATION INTO @SPOT; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @T30 = 0; 
    SET @T90 = 0; 
    SET @T100 = 0; 

    SELECT 
    @T30 = SUM(CASE WHEN MaxTemp > 30 AND MaxTemp < 70 THEN 1 ELSE 0 END), 
    @T90 = SUM(CASE WHEN MaxTemp >= 70 AND MaxTemp < 100 THEN 1 ELSE 0 END), 
    @T100 = SUM(CASE WHEN MaxTemp >= 100 THEN 1 ELSE 0 END) 
    FROM @DATA WHERE SpotID = @SPOT 

    INSERT INTO @NEWDATA VALUES (@SPOT,@T30,@T90,@T100) 
    FETCH NEXT FROM STATION INTO @SPOT; 
END; 

CLOSE STATION; 
DEALLOCATE STATION; 

SELECT * FROM @NEWDATA 

하지 어쨌든 나는 요청 코드를 작성,하지만이 예제는 간단한 커서를 테이블 변수를 만드는 방법을 보여줍니다 루핑 및 새 테이블로로드되는 변수에 대한 응답 쓰기를 수행합니다.

움직이는 부분은 많지만 루프를 수행하는 데 필요한 통찰력을 줄 수 있습니다.

관련 문제