2015-12-28 4 views
0

Мне нужен эффективный способ преобразования данных, возвращаемых в строки в столбцы для базы данных футбола, над которой я работаю.SQL Query - строки в столбцы, но без pivot

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 
Смежные вопросы