繁体   English   中英

在SQL中使用循环填充表(SQL Server)

[英]Using a loop in SQL to populate the table (SQL Server)

我对SQL和循环特别陌生,在以下问题上需要一些帮助。

我有一张这样的桌子:

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

因此,我要计算的是不同事件ID的温度超过每个SpotID的限制30、70和100的次数。

有没有办法做到这一点与循环? 我的数据集显然更大,我很好奇我如何使用高效的东西。

非常感谢你。

麦克风

您只需要条件聚合:

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;

对上一个帖子进行了一个较小的更改,我的版本仅在每个温度范围内计数,否则较低的温度将计算大多数温度,而不是该范围内的温度。

 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

如果您只是想学习如何使用循环...。

 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

无论如何,我不会编写请求的代码,但是此示例显示了如何创建表变量,用于循环的简单游标以及写入对加载到新表中的变量的答案。

很多活动部件,但它可以使您深入了解执行循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM