Заполнение одной таблицы SQL Server значениями из другой

У меня есть таблица scoresByMinute, которая показывает счет всякий раз, когда забивается гол в футболе.

matchID  minute scoreline
  1        24     10
  1        53     20
  1        81     21 
  2         7     01 ...

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

matchID  minute  scoreline
  1        1      00
  1        2      00
...
  1       23      00
  1       24      01
  1       25      01
...
  1       89      21
  1       90      21
  2        1      00

так далее

Как мне это сделать?


person pssguy    schedule 28.04.2011    source источник
comment
что такое счет? например, когда у вас есть «10», это означает 1-0 (счет)?   -  person M.R.    schedule 28.04.2011
comment
@M.R.: Хороший вопрос! Я не обращал на это внимания, пока вы не спросили. И я думаю, вы правильно догадались, это очень похоже на партитуру. (И, кстати, OP, похоже, не допускает, чтобы оценка была больше 9.)   -  person Andriy M    schedule 28.04.2011
comment
круто - решение, которое я опубликовал, будет работать в любом случае... если вы решите разделить его на отдельные поля, то есть...   -  person M.R.    schedule 28.04.2011
comment
Спасибо, ребята, за публикации и комментарии. Да, счет таков, как вы предложили, в любой момент времени, поэтому поле символов создано для крошечных очков, домашнего и выездного счета. Извините, я должен был упомянуть об этом. Он не подходит для команд, набравших более 9 очков в игре, чего не было за 20 лет в лиге, которую я рассматриваю, и в любом случае не имеет значения для моей цели. Андрей, большое спасибо за это, он отлично работает с моими реальными данными. Мне нужно будет больше прочитать об этом методе, но не могли бы вы просто объяснить, о чем идет речь в строке INNER JOIN master..spt_values ​​v ON v.type = 'P'   -  person pssguy    schedule 28.04.2011
comment
О, тогда я тоже должен извиниться, я должен был хотя бы проинформировать вас об этом столе. Вы можете начать чтение с этот вопрос. Короче говоря, это системная таблица, которая существует давно и используется для внутренних целей. Фильтр v.type = 'P' дает подмножество таблицы с последовательностью уникальных значений number от 0 до 2047. Итак, я просто использую таблицу (в частности подмножество) как таблица итогов.   -  person Andriy M    schedule 29.04.2011


Ответы (2)


Создайте новую таблицу с желаемой структурой, а затем запустите ее для каждого совпадения.


declare @counter int
declare @scoreline varchar(10)
declare @matchID int


set @counter = 1
set @matchID = 1
set @scoreline = '00'

while (@counter <= 90)
begin
    select @scoreline = ISNULL(scoreline,@scoreline) from scores where minute = @counter

    insert into filledScoreLines(matchID, minute, scoreline)
    select @matchID as matchID, @counter as min, @scoreline as scoreline
    set @counter = @counter + 1
end

Чтобы сделать это для нескольких совпадений, просто переберите все идентификаторы совпадений, которые у вас есть, например:



declare @matchID int

declare getEm cursor local  for select distinct matchID from scoresByMinute 

open getEm
        while (1=1)
        begin
                 fetch next from getEm into @matchID

                 if (@@fetch_status  0)
                    begin
                        DEALLOCATE getEm
                        break
                    end


                    declare @counter int
                    declare @scoreline varchar(10)

                    set @counter = 1
                    set @scoreline = '00'

                    while (@counter <= 90)
                    begin
                        select @scoreline = ISNULL(scoreline,@scoreline) from scores where minute = @counter

                        insert into filledScoreLines(matchID, minute, scoreline)
                        select @matchID as matchID, @counter as min, @scoreline as scoreline
                        set @counter = @counter + 1
                    end
        end  


person M.R.    schedule 28.04.2011
comment
Спасибо за ваше решение. К тому времени, когда я вернулся на страницу, вы уже положительно отозвались об альтернативном подходе, поэтому я сосредоточился на нем. Надеюсь, вы найдете CTE полезными в будущем - person pssguy; 28.04.2011

person    schedule
comment
это цепочка операторов таблицы? Я не слишком хорошо знаком с этим способом, но, безусловно, выглядит намного изящнее, чем мой. Не могли бы вы поделиться некоторыми подробностями, где я могу прочитать об этом? - person M.R.; 28.04.2011
comment
@M.R.: В этом решении используются CTE или Common Table Expressions. По сути, они являются производными таблицами, как и подвыборки, и допустимы в рамках одного оператора, которому они предшествуют. (В данном случае — SELECT *... в конце скрипта, но это также может быть INSERT, UPDATE или DELETE.) Примечательно, что в отличие от подзапросов на них можно ссылаться в операторе несколько раз по их именам ( то есть вы можете получить из них несколько наборов результатов). Их не было в SQL Server до версии 2005 года. - person Andriy M; 28.04.2011
comment
круто - буду читать. +1 за то, что познакомил меня с чем-то новым :) - person M.R.; 28.04.2011