Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL中的循环填充表(SQL Server)_Sql_Sql Server_Loops - Fatal编程技术网

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

使用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

我是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
因此,我要做的是计算不同事件的温度超过每个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,所以我不能