[英]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.