2014-11-04 3 views
0

Я совершенно новый с SQL и особенностями циклов и нуждаюсь в помощи по следующей проблеме.Использование цикла в SQL для заполнения таблицы (SQL Server)

У меня есть таблица вроде этого:

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 

Так что я после того, как это подсчет сколько раз температура превышала пределы 30, 70 и 100 для SpotID для разных EventID.

Есть ли способ сделать это с помощью петли? Мой набор данных, очевидно, больше, и мне интересно, как я могу использовать что-то эффективное.

спасибо.

Майк

+0

Какие СУБД? Сервер Sql? Mysql? –

+0

Извините, забыли добавить! Это Sql Server – MikeB

ответ

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; 
+0

Спасибо, Гордон! – MikeB

+0

Вы приняли версию вместо курсора? У вас есть привилегия принять любой ответ, который вам нравится, но в целом вы должны избегать курсоров, если сможете. –

0

Одно незначительное изменение к предыдущему сообщению, моя версия имеет значение только в пределах каждого диапазона температуры, иначе нижние темпы будут рассчитывать большинство временных секретарей не Temps в это область.

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 
+0

Вопрос: У вас есть PWS? –

+0

Спасибо, что ответ Стивен. Извините, но я не уверен, что знаю, что такое PWS, поэтому я не могу этого бояться. – MikeB

+0

PWS = Персональная метеостанция. Я собирал метеорологические данные из шахт в течение последних 5 лет, пока последний шторм (ветры 90MPH) не облетел в обломки, чтобы полностью удалить мою станцию ​​с ее мачты. –

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 

Не в любом случае я хотел бы написать код, который требуется, но этот пример показывает, как создать таблицу переменных, простой курсор для циклизации и записи ответов на переменные, загружаемые в новую таблицу.

Много движущихся частей, но это может дать вам представление о петлях.

Смежные вопросы