2014-11-04 41 views
0

我對SQL很感興趣,尤其是循環,需要一些幫助解決以下問題。在SQL中使用循環來填充表(SQL Server)

我有這樣的一個表:

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 

我想生成以下輸出一個新表:

SpotID Over30 Over70 Over100 

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

所以我是後是多少次的計數對於不同的EventID,溫度是否超過每個SpotID 30,70和100的限制。

有沒有辦法用循環做到這一點?我的數據集顯然更大,我很好奇我是否可以使用高效的東西。

非常感謝。

邁克

+0

什麼DBMS? Sql Server? MySQL的? – 2014-11-04 22:53:31

+0

對不起,忘記了!這是Sql Server – MikeB 2014-11-04 23:22:12

回答

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 2014-11-04 23:31:18

+0

您是否使用遊標接受了該版本?您有權接受您喜歡的任何答案,但總的來說,如果可以的話,您應該避免使用遊標。 – 2014-11-05 12:47:35

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嗎? – 2014-11-04 23:07:27

+0

謝謝你的回答斯蒂芬。我很抱歉,但我不確定我是否知道PWS是什麼,所以我害怕我無法忍受。 – MikeB 2014-11-04 23:23:55

+0

PWS =個人氣象站。 過去5年來,我一直在收集礦井的天氣數據,直到最後一場風暴(90MPH風)爲止,纔將飛行碎片完全從其桅杆上取下。 – 2014-11-04 23:28:47

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 

反正我會寫請求的代碼,但這個例子說明如何創建表變量,一個簡單的遊標用於循環,並寫入到加載到新表中的變量的答案中。

很多移動部件,但它可以讓你洞察做循環。