使用SQL中的循环填充表(SQL Server)
我是SQL和循环的新手,尤其需要以下问题的帮助 我有一张这样的桌子:使用SQL中的循环填充表(SQL Server),sql,sql-server,loops,Sql,Sql Server,Loops,我是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
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
因此,我要做的是计算不同事件的温度超过每个SpotID 30、70和100极限的次数
有没有办法通过循环来实现这一点?我的数据集显然更大,我很好奇我如何才能使用高效的东西
多谢各位
Mike您只需要条件聚合:
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;
您只需要条件聚合:
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表(
SpotID INT,
EventID INT,
MaxTemp INT
)
插入@数据值
(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,
总和(当MaxTemp>30且MaxTemp<70时,则为1,否则为0结束)超过_30,
总和(当MaxTemp>=70且MaxTemp<100时,则为1,否则为0结束)超过_70,
总和(当MaxTemp>=100时,则为1,否则为0结束)超过\u 100
从…起
@资料
分组
斑点状
对上一篇文章的一个小改动,我的版本只计算每个温度范围内的温度,否则较低的温度将计算大多数温度,而不是该范围内的温度
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表(
SpotID INT,
EventID INT,
MaxTemp INT
)
插入@数据值
(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,
总和(当MaxTemp>30且MaxTemp<70时,则为1,否则为0结束)超过_30,
总和(当MaxTemp>=70且MaxTemp<100时,则为1,否则为0结束)超过_70,
总和(当MaxTemp>=100时,则为1,否则为0结束)超过\u 100
从…起
@资料
分组
斑点状
如果您只想学习如何使用循环
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
DECLARE@DATA表(
SpotID INT,
EventID INT,
MaxTemp INT
);
声明@NEWDATA表(
SpotID INT,
T30国际机场,
T90 INT,
T100整数
);
声明
@点为INT,
@T30为整数,
@T90为整数,
@T100为整数;
插入@数据值
(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为@DATA GROUP中的SELECT SpotID声明站点光标;
开放站;
从车站接下一个到@SPOT;
而@@FETCH\u STATUS=0
开始
设置为@T30=0;
设置@T90=0;
设置为@T100=0;
挑选
@T30=总和(当MaxTemp>30且MaxTemp<70时,则为1,否则为0结束),
@T90=总和(当MaxTemp>=70且MaxTemp<100时,则为1,否则为0结束),
@T100=总和(当MaxTemp>=100时,则为1,否则为0结束)
来自@DATA,其中SpotID=@SPOT
插入@NEWDATA值(@SPOT、@T30、@T90、@T100)
从车站接下一个到@SPOT;
结束;
关闭车站;
释放站;
从@NEWDATA中选择*
无论如何,我不会编写所请求的代码,但这个示例演示了如何创建表变量、用于循环的简单游标,以及如何写入加载到新表中的变量的答案
有很多活动部件,但它可以让你深入了解循环。如果你只是想学习如何使用循环
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
DECLARE@DATA表(
SpotID INT,
EventID INT,
MaxTemp INT
);
声明@NEWDATA表(
SpotID INT,
T30国际机场,
T90 INT,
T100整数
);
声明
@点为INT,
@T30为整数,
@T90为整数,
@T100为整数;
插入@数据值
(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为@DATA GROUP中的SELECT SpotID声明站点光标;
开放站;
从车站接下一个到@SPOT;
而@@FETCH\u STATUS=0
开始
设置为@T30=0;
设置@T90=0;
设置为@T100=0;
挑选
@T30=总和(当MaxTemp>30且MaxTemp<70时,则为1,否则为0结束),
@T90=总和(当MaxTemp>=70且MaxTemp<100时,则为1,否则为0结束),
@T100=总和(当MaxTemp>=100时,则为1,否则为0结束)
来自@DATA,其中SpotID=@SPOT
插入@NEWDATA值(@SPOT、@T30、@T90、@T100)
从车站接下一个到@SPOT;
结束;
关闭车站;
释放站;
从@NEWDATA中选择*
无论如何,我不会编写所请求的代码,但这个示例演示了如何创建表变量、用于循环的简单游标,以及如何写入加载到新表中的变量的答案
有很多活动部件,但它可以让您深入了解循环。什么是DBMS?Sql Server?Mysql?对不起,忘记添加了!它是Sql Server什么数据库管理系统?Sql Server?Mysql?对不起,忘记添加了!这是Sql Server问题您有PWS吗?谢谢您的回答Stephen。对不起,我不知道什么是个人气象站,所以我不敢问。个人气象站。在过去的5年里,我一直在收集我的气象数据,直到最后一场风暴(90英里/小时的风)将飞行的碎片击落,从而将我的站从桅杆上完全移除。添加了第二个答案,即使用循环,以防你对如何使用光标进行循环感兴趣。不,我没有PWS,这只是一些随机项目(半工作相关…)但是我想了解更多关于SQL的知识,因此我提出了这个问题。听到车站受损的消息我很难过!非常感谢循环示例!我想学习如何使用它们,所以这绝对有帮助!再次感谢!问题你有PWS吗?谢谢你的回答Stephen。我很抱歉,但我不确定我知道什么是PWS,所以我不能