2016-06-20 2 views
0

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

Ниже показаны четыре таблицы (сверху вниз): - оценка - ScoreReference - Крепеж - TeamWeighting

enter image description here

Я хочу, чтобы попытаться определить разницу в teamWeighting между обеими сторонами для каждого прибора и на основе взвешивания он определяет оценку для обновления таблицы «Fixture», выбирая счет, соответствующий разнице мячей, в зависимости от разницы «TeamWeighting».

Как вы можете видеть, он отображает NULL, и я не уверен, почему это так.

Ниже приведен код запроса, который я знаю, что вызывает проблему:

;WITH cte AS 
(
    SELECT f.FixtureID, 
     ht.FinalTeamWeight - at.FinalTeamWeight AS TeamScore 
    FROM dbo.Fixture f 
    OUTER APPLY 
    (
     SELECT tw.FinalTeamWeight 
     FROM dbo.TeamWeighting tw 
     WHERE tw.TeamID = f.HomeTeamID 
    ) ht --HomeTeam 
    OUTER APPLY 
    (
     SELECT tw.FinalTeamWeight 
     FROM dbo.TeamWeighting tw 
     WHERE tw.TeamID = f.AwayTeamID 
    ) at --AwayTeam 
    WHERE f.HomeScore IS NULL AND f.FixtureDate < GETDATE() 
) 


UPDATE f 
SET f.HomeScore = s.HomeScore, 
    f.AwayScore = s.AwayScore 
FROM dbo.Fixture f 
INNER JOIN 
(
    SELECT FixtureID, 
    TeamScore, 
    (
     SELECT TOP (1) 
     CASE 
      WHEN c.TeamScore BETWEEN HomeWeighting AND AwayWeighting 
       THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore ORDER BY NEWID()) 
      WHEN c.TeamScore BETWEEN AwayWeighting AND HomeWeighting 
       THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE AwayScore > HomeScore ORDER BY NEWID()) 
     END AS ScoreID 
     FROM dbo.Score s 
     LEFT JOIN ScoreReference sr 
     ON s.ScoreDifference = sr.ScoreDifference 

    ) AS ScoreID -- end select case 

FROM cte c 

) -- end inner join 

AS ScoreResult 
    ON f.FixtureID = ScoreResult.FixtureID 
INNER JOIN Score s 
    ON ScoreResult.ScoreID = s.ScoreID 
INNER JOIN ScoreReference sr 
    ON s.ScoreDifference = sr.ScoreDifference 


    Select * from dbo.Score 
    Select * from dbo.ScoreReference 
    SELECT * from dbo.Fixture 
    SELECT * From TeamWeighting 

END 
+1

Это дубликат [Receving не агрегатную функцию или GROUP BY ошибки в КТР] (http://stackoverflow.com/questions/37914484/receving-not-an-aggregate-function- или-group-by-error-in-a-cte) – sagi

+0

Hi Carl. Попробуйте поставить ELSE 0 в заявлении case на данный момент. Если вы получаете 0, то вы знаете, что есть проблема с заявлением CASE. – mvisser

+0

@mvisser Я сделаю это сейчас и уточню, что происходит. Спасибо –

ответ

1

Попробуйте это. Это должно работать

DECLARE @fixtureID INT, 
    @scoreDifference INT 

;WITH cte AS 
(
    SELECT f.FixtureID, 
     ht.FinalTeamWeight - at.FinalTeamWeight AS TeamScore 
    FROM dbo.Fixture f 
    OUTER APPLY 
    (
     SELECT tw.FinalTeamWeight 
     FROM dbo.TeamWeighting tw 
     WHERE tw.TeamID = f.HomeTeamID 
    ) ht --HomeTeam 
    OUTER APPLY 
    (
     SELECT tw.FinalTeamWeight 
     FROM dbo.TeamWeighting tw 
     WHERE tw.TeamID = f.AwayTeamID 
    ) at --AwayTeam 
    WHERE f.HomeScore IS NULL AND f.FixtureDate < GETDATE() 
) 


SELECT FixtureID, 
    ScoreDifference 
INTO #processData 
FROM 
(
    SELECT DISTINCT c.FixtureID, 
      TeamScore, 
      CASE WHEN TeamScore BETWEEN sr.HomeWeighting AND sr.AwayWeighting 
        THEN sr.ScoreDifference 
       WHEN TeamScore BETWEEN sr.AwayWeighting AND sr.HomeWeighting 
        THEN sr.ScoreDifference 
      END AS ScoreDifference 
    FROM cte c 
    CROSS APPLY ScoreReference sr 
) score 
WHERE ScoreDifference IS NOT NULL 

WHILE (SELECT COUNT(*) FROM #processData) > 0 
BEGIN 

    SELECT TOP 1 @fixtureID = FixtureID, 
     @scoreDifference = ScoreDifference 
    FROM #processData 

    UPDATE f 
    SET f.HomeScore = score.HomeScore, 
    f.AwayScore = score.AwayScore 
    FROM 
    (
     SELECT TOP 1 HomeScore, 
      AwayScore, 
      @fixtureID AS FixtureID 
     FROM Score s 
     WHERE ScoreDifference = @scoreDifference 
     ORDER BY NEWID() 
    ) AS score 
    INNER JOIN Fixture f 
     ON f.FixtureID = score.FixtureID 

    DELETE #processData 
    WHERE FixtureID = @fixtureID 

END 

    DROP TABLE #processData 
+0

Отлично благодарю вас. Я только что отправил вам еще одно электронное письмо несколько минут назад, прежде чем вы ответите на что-то, что вас может заинтересовать. Еще раз спасибо –

1

Попробуйте это.

;WITH cte AS 
(
    SELECT f.FixtureID, 
     ht.FinalTeamWeight - at.FinalTeamWeight AS TeamScore 
    FROM dbo.Fixture f 
    OUTER APPLY 
    (
     SELECT tw.FinalTeamWeight 
     FROM dbo.TeamWeighting tw 
     WHERE tw.TeamID = f.HomeTeamID 
    ) ht --HomeTeam 
    OUTER APPLY 
    (
     SELECT tw.FinalTeamWeight 
     FROM dbo.TeamWeighting tw 
     WHERE tw.TeamID = f.AwayTeamID 
    ) at --AwayTeam 
    WHERE f.HomeScore IS NULL AND f.FixtureDate < GETDATE() 
) 


UPDATE f 
SET f.HomeScore = s.HomeScore, 
    f.AwayScore = s.AwayScore 
FROM dbo.Fixture f 
INNER JOIN 
(
    SELECT FixtureID, 
    TeamScore, 
    (
     SELECT TOP (1) 
     CASE 
      WHEN c.TeamScore BETWEEN HomeWeighting AND AwayWeighting 
       THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore ORDER BY NEWID()) 
      WHEN c.TeamScore BETWEEN AwayWeighting AND HomeWeighting 
       THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE AwayScore > HomeScore ORDER BY NEWID()) 
     END AS ScoreID 
     FROM dbo.Score s 
     INNER JOIN ScoreReference sr 
     ON s.ScoreDifference = sr.ScoreDifference 

    ) AS ScoreID -- end select case 

FROM cte c 

) -- end inner join 

AS ScoreResult 
    ON f.FixtureID = ScoreResult.FixtureID 
INNER JOIN Score s 
    ON ScoreResult.ScoreID = s.ScoreID 
INNER JOIN ScoreReference sr 
    ON s.ScoreDifference = sr.ScoreDifference 


    Select * from dbo.Score 
    Select * from dbo.ScoreReference 
    SELECT * from dbo.Fixture 
    SELECT * From TeamWeighting 

END 
+0

Тот же вопрос mvisser. У меня есть работа, сильно закодированная, но не путем поиска. Не нужно, если вам нужна версия с жестким кодированием? –

+0

wow ok. передайте мне жесткий код – mvisser

+0

Я отправил его вам по электронной почте –

Смежные вопросы