2014-11-04 80 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 

反正我会写请求的代码,但这个例子说明如何创建表变量,一个简单的游标用于循环,并写入到加载到新表中的变量的答案中。

很多移动部件,但它可以让你洞察做循环。