Sql server 2005 用另一个SQL Server表中的值填充一个SQL Server表

Sql server 2005 用另一个SQL Server表中的值填充一个SQL Server表,sql-server-2005,tsql,Sql Server 2005,Tsql,我有一个表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

我有一个表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


我应该怎么做呢?

创建一个具有所需结构的新表,然后为每个匹配运行该表

;WITH scoresByMinute (matchID, minute, scoreline) AS (
  SELECT 1, 24, '10' UNION ALL
  SELECT 1, 53, '20' UNION ALL
  SELECT 1, 81, '21' UNION ALL
  SELECT 2,  7, '01'
),
maxMins AS (
  SELECT
    matchID,
    maxMin = MAX(minute)
  FROM scoresByMinute
  GROUP BY matchID
),
allminutes AS (
  SELECT
    m.matchID,
    minute = v.number,
    scoreline = s.scoreline
  FROM maxMins m
    INNER JOIN master..spt_values v ON v.type = 'P'
      AND v.number BETWEEN 1 AND CASE WHEN m.maxMin < 90 THEN 90 ELSE m.maxMin END
    LEFT JOIN scoresByMinute s ON m.matchID = s.matchID and v.number = s.minute
),
filledscorelines AS (
  SELECT
    matchID,
    minute,
    scoreline = COALESCE(scoreline, '00')
  FROM allminutes
  WHERE minute = 1
  UNION ALL
  SELECT
    m.matchID,
    m.minute,
    scoreline = COALESCE(m.scoreline, s.scoreline)
  FROM allminutes m
    INNER JOIN filledscorelines s ON m.matchID = s.matchID
      AND m.minute = s.minute + 1
)
SELECT *
FROM filledscorelines
ORDER BY matchID, minute

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
要对多个匹配执行此操作,只需循环您拥有的所有匹配ID即可-如下所示:



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  


什么是分数线?比如,当你有“10”时,这是否意味着分数是1-0?@M.R:好问题!直到你问起我才注意到。我想你猜对了,这和分数很像。顺便说一句,OP似乎不允许分数大于9。酷-我发布的解决方案无论哪种方式都有效。。。。如果你决定把它分成不同的字段,那就是…谢谢大家的帖子和评论。是的,分数线是您建议的任何时间点的分数,因此创建了从到tinyints、homescore和awayscore的角色字段。对不起,我应该提一下。它不适合在一场比赛中得分超过9分的球队,而这场比赛在我所关注的联赛中已经20年没有发生过了,而且对我的目的来说也不重要。安德烈,非常感谢,这对我的真实数据非常有用。我需要阅读更多关于这个方法的内容,但是你能解释一下什么是行内部连接master..spt_值v on v.type='P'是关于h的,我也必须道歉,我至少应该向你简要介绍一下这个表。你可以从开始阅读。简而言之,这是一个长期存在的系统表,用于内部目的。v.type='P'过滤器给出了表的一个子集,其中包含从0到2047的唯一数值序列。所以,我只是使用表,特别是子集作为一个。这是表语句的链接吗?我不太熟悉这样做,但看起来肯定比我的要圆滑得多。你能告诉我一些细节吗?@M.R:这个解决方案使用CTE,或者。它们本质上是派生表,就像subselect一样,并且在它们前面的单个语句的范围内有效。在这种情况下–选择*。。。在脚本末尾,但也可以是插入、更新或删除。与subselect不同,它们的显著之处在于,它们可以在语句中多次被引用,通过它们的名称,也就是说,您可以从它们派生多个结果集。直到2005年版本.cool-will出现,SQL Server中才出现了它们+谢谢你给我介绍了一些新东西:谢谢你的解决方案。当我回到页面时,你已经对另一种方法发表了积极的评论,所以我把注意力集中在这一点上。希望您发现CTE在将来有用