我很熟悉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
所以我所追求的是不同EventID的温度超过每个SpotID 30,70和100的限制的次数。
有没有办法用循环来做到这一点?我的数据集显然更大,我很好奇我是否可以使用有效的东西。
非常感谢你。
迈克答案 0 :(得分: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;
答案 1 :(得分: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
答案 2 :(得分: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
我不会写所请求的代码,但是这个例子展示了如何创建表变量,一个简单的循环游标,以及写入加载到新表中的变量的答案。
许多活动部件,但它可以让你深入了解循环。