2012-10-31 163 views
0

我正在嘗試爲體育團隊構建報表。結果存儲在SQL數據庫中,如下所示: TableSQL查詢:倒數第二倒數第三倒數(微軟SQL)

對於報告,我需要將Home2-Away4列填充相應的結果。 這意味着:

想象:ID = 10和家庭(無)(組#)= 1 - >HOME1 =導致一個遊戲,這是之前ID = 3和球隊客場和結果是0(= home1)。這是我已經做了,但家庭2 =導致場比賽前,爲Home3 =導致場比賽前等。

這裏是如何我已經做到了這一點:

SELECT top 1 [result_home] from (SELECT Top 2 [result_home] FROM 
(SELECT top 2 [result_home] from [Table] 
where [ID] < 10 and ([Home(no.)]=1 or [Away(No.)]=1) order by [ID] desc ) top2 )top1 

(微軟的SQL Server Express 2012 BTW)

我寫這決定是否從result_home或result_away挑一個小的Java代碼。

基本問題是:如何在兩個或多個遊戲日前查詢遊戲結果?

在此先感謝。

親切的問候

斯特凡

回答

2

我認爲你需要LAG函數。最簡單的情況會是這樣的:

[Home1] = LAG(result_Home, 1) OVER(PARTITION BY [Home(no.)] ORDER BY ID), 

但是,它並不像這樣簡單,因爲你需要引用在家或外出,所以你需要先逆透視數據

SELECT ID, 
     Type, 
     TeamID, 
     Result 
FROM T 
     CROSS APPLY 
     ( VALUES 
       ('Home', [Home(no.)], Result_Home), 
       ('Away', [Away(no.)], Result_Away) 
     ) Upvt (Type, TeamID, Result); 

這意味着您可以訪問每個團隊的結果,無論它是在家還是在一列(對於滯後函數)。

然後用這個未轉換的數據,你應用滯後來獲得前4個結果(我用ORDER BY ID但我假設有一個日期字段,我失蹤了?):

SELECT *, 
     [Result1] = LAG(Result, 1) OVER(PARTITION BY TeamID ORDER BY ID), 
     [Result2] = LAG(Result, 2) OVER(PARTITION BY TeamID ORDER BY ID), 
     [Result3] = LAG(Result, 3) OVER(PARTITION BY TeamID ORDER BY ID), 
     [Result4] = LAG(Result, 4) OVER(PARTITION BY TeamID ORDER BY ID) 
FROM (Previous Query) 

然後,一旦你有每個隊前4個結果每場比賽,你可以加入逆轉置數據一起回來,再次得到在同一行的主場和客場的球隊,給人完整的查詢:

WITH Results AS 
( SELECT ID, 
      Type, 
      TeamID, 
      Result 
    FROM T 
      CROSS APPLY 
      ( VALUES 
        ('Home', [Home(no.)], Result_Home), 
        ('Away', [Away(no.)], Result_Away) 
      ) Upvt (Type, TeamID, Result) 
), Results2 AS 
( SELECT *, 
      [Result1] = LAG(Result, 1) OVER(PARTITION BY TeamID ORDER BY ID), 
      [Result2] = LAG(Result, 2) OVER(PARTITION BY TeamID ORDER BY ID), 
      [Result3] = LAG(Result, 3) OVER(PARTITION BY TeamID ORDER BY ID), 
      [Result4] = LAG(Result, 4) OVER(PARTITION BY TeamID ORDER BY ID) 
    FROM Results 
) 
SELECT Home.ID, 
     [Home(no.)] = Home.TeamID , 
     [Away(no.)] = Away.TeamID, 
     [Result_Home] = Home.Result, 
     [Result_Away] = Away.Result, 
     [Home1] = Home.Result1, 
     [Home2] = Home.Result2, 
     [Home3] = Home.Result3, 
     [Home4] = Home.Result4, 
     [Away1] = Away.Result1, 
     [Away2] = Away.Result2, 
     [Away3] = Away.Result3, 
     [Away4] = Away.Result4 
FROM Results2 AS Home 
     INNER JOIN results2 AS Away 
      ON Away.ID = Home.ID 
      AND Away.Type = 'Away' 
WHERE Home.Type = 'Home' 
ORDER BY ID; 

Example on SQL Fiddle

+0

哇!這很好。非常感謝!! –

0

看起來你正在尋找的ROW_NUMBER()功能或另一個窗口函數

喜歡的東西

;with cte as 
(
    select id, home as team, result_home as score from yourtable 
    union 
    select id, away, result_away from yourtable 
), 
games as 
(
    select *, ROW_NUMBER() over (partition by team order by id) as gameday 
    from cte 
) 
    select * 
    from (select team, score, gameday from games) src 
    pivot 
    (max(score) for gameday in ([1],[2],[3],[4],[5],[6]))p 

如果你知道一個人的遊戲比賽日對於每支球隊來說,那麼前兩場比賽就是這場比賽的比賽日--2等。

+0

感謝您的幫助:-) –