2015-12-28 139 views
0

我需要一種有效的方式來將行中返回的數據轉換爲我正在處理的足球數據庫的列。SQL查詢 - 行列但沒有樞軸

2張桌子,一個夾具,一個夾持預測。

Fixtures

enter image description here

Predictions

enter image description here

我想在這兩個表中返回的數據如下(不能發佈另一個鏈接,但此查詢會給你的想法):

SELECT 1 as UserID, 
    2 as [Stoke vs Man United], 
    1 as [Bournemouth vs Crystal Palace], 
    2 as [Swansea vs West Brom], 
    1 as [Chelsea vs Watford], 
    3 as [Liverpool vs Leicester], 
    1 as [Tottenham vs Norwich], 
    2 as [Aston Villa vs West Ham] 

問題是,每個星期,所選擇的團隊都會改變,所以我無法獲得數據透視查詢的工作。有任何想法嗎?

+6

'我無法獲得數據透視查詢工作.'顯示您的試用版,正確標記問題(SQL Server)並準備http://sqlfiddle.com。無論如何,這個問題是相同問題主軸/動態主軸的1001個重複。 – lad2025

回答

0

2件你需要知道的工作。

  1. Dynamic Pivot
  2. sp_executesql

-- Param Definitions 
DECLARE @Sql NVARCHAR(MAX), 
     @Columns NVARCHAR(MAX), 
     @WeekNo INT = 6, 
     @UserID INT = 1, 
     @Params NVARCHAR(MAX) = N'@Week INT, @User INT' 

-- Dynamic Column Names 
SELECT @Columns = COALESCE(@Columns + ',','') + QUOTENAME(HomeTeamName + ' vs ' + AwayTeamName) 
FROM usr_SS_Fixtures 
WHERE WeekNo = @WeekNo 

-- Dynamic SQL 
SET @Sql = N' 
SELECT * 
FROM 
(
    SELECT 
     pred.UserId, 
     pred.ResultCode, 
     CONCAT(HomeTeamName,'' vs '', AwayTeamName) AS Teams 
    FROM 
     usr_SS_Fixtures fix 
     JOIN usr_SS_Predictions pred ON fix.EventID = pred.EventID AND fix.WeekNo = pred.WeekNo 
    WHERE 
     fix.WeekNo = @Week 
     AND pred.UserID = @User 
) t 
PIVOT 
(
    MAX(ResultCode) 
    FOR Teams IN (' + @Columns + ') 
) p 
' 

-- Executes the dynamic SQL 
EXECUTE sp_executesql @Sql, @Params, @Week = @WeekNo, @User = @UserID 

DEMO

0

你必須對正常動態樞軸問題,杜一個有趣的變化e到已知事件最大數量的遊戲,這使得一個可能的解決方案變得更簡單一些。嘗試下面的SQL;它會創建一個第一行,其中包含所需的列標題,這可能足以滿足簡單的顯示目的。

declare @weekNo as int = 6 
     ,@UserID as int = 1; 
with 
fixture(UserID, EventID, [Value], GameNo) as (
    select -1, EventID, AwayTeamName + ' at ' + HomeTeamName 
     , row_number() over (partition by WeekNo order by EventID) 
    from usr_SS_Fixtures 
), 
prediction(UserID, EventID, [Value], GameNo) as (
    select UserID, EventID, ResultCode 
     , row_number() over (partition by WeekNo order by EventID) 
    from usr_SS_Predictions 
), 
data as (
    select 
     WeekNo, UserID 
     ,[1],[2],[3],[4],[5],[6],[7] 
    from (
     select WeekNo, UserID, EventID, [Value] from fixture 
     union all 
     select WeekNo, UserID, EventID, [Value] from prediction 
    ) T 
    pivot (
     max([Value]) for GameNo in ([1],[2],[3],[4],[5],[6],[7]) 
    ) pvt 
) 
select 
    UserID,[1],[2],[3],[4],[5],[6],[7] 
from data 
where WeekNo = @WeekNo 
order by 
    UserID