2016-06-20 4 views
0

내 사례 문에서 하드 코딩 된 값을 사용하는 대신 룩업 테이블을 사용하여 경계를 결정하고 싶습니다. 나는 어떤 종류의 룩업 테이블도하지 않았으므로 단지 다음을 코딩하는 방법에 대한 지침을 원했다.하드 코딩 된 값을 찾아보기 테이블로 바꾸기

enter image description here

가 어떻게 하드 코딩 된 값을 대체 할 내 CASE 문에서이 조회 테이블을 사용할 수 있습니다

나는 다음과 같은 표시 'ScoreReference'로 알려진 테이블이?

SELECT 
TeamScore, 
CASE WHEN TeamScore BETWEEN 11 AND 25 --Home Team Wins by 1 goal 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 1 ORDER BY NEWID()) 
    WHEN TeamScore BETWEEN 26 AND 40 --Home Team Wins by 2 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 2 ORDER BY NEWID()) 
    WHEN TeamScore BETWEEN 41 AND 55 --Home Team Wins by 3 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 3 ORDER BY NEWID()) 
    WHEN TeamScore BETWEEN 56 AND 70 --Home Team Wins by 4 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 4 ORDER BY NEWID()) 
    WHEN TeamScore > 71 --Home Team Wins by 5 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 5 ORDER BY NEWID()) 
    WHEN TeamScore BETWEEN -25 AND -11 --Away Team Wins by 1 goal 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -1 ORDER BY NEWID()) 
    WHEN TeamScore BETWEEN -40 AND -26 --Away Team Wins by 2 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -2 ORDER BY NEWID()) 
    WHEN TeamScore BETWEEN -55 AND -41 --Away Team Wins by 3 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -3 ORDER BY NEWID()) 
    WHEN TeamScore BETWEEN -70 AND -56 --Away Team Wins by 4 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -4 ORDER BY NEWID()) 
    WHEN TeamScore <= -71 --Away Team Wins by 5 goals 
     THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -5 ORDER BY NEWID())  
    ELSE (SELECT TOP 1 ScoreID FROM dbo.Score WHERE ScoreDifference = 0 ORDER BY NEWID()) -- Draw 
END AS ScoreID 

업데이트 :

다음

은 '점수'테이블 : 당신은 내가 뭘하려고 오전 볼 수 있듯이

enter image description here

은 각 팀의 가중치에 따라 (한 팀 가중치는 홈팀이고 다른 하나는 어웨이 팀 '입니다), 가중치의 차이는 점수에 반영됩니다. 예 양 팀 간의 가중치가 11-25 사이의 차이 일 경우 점수 차이는 '1'입니다. 이는 '점수'표에서 의미하는 바에 따라 '1'차이가있는 점수를 무작위로 선택합니다. 두 테이블에 대한

날짜 SET :

ScoreReference :

CREATE TABLE [dbo].[ScoreReference] 
(
    [ScoreReferenceID] TINYINT IDENTITY (1,1) NOT NULL PRIMARY KEY, 
    [HomeWeighting] INT NULL, 
    [AwayWeighting] INT NULL, 
    [ScoreDifference] INT NULL 
) 

점수 :

CREATE TABLE [dbo].[Score] 
(
    [ScoreID] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [HomeScore] INT NULL, 
    [AwayScore] INT NULL, 
    [ScoreDifference] INT NULL 
) 

기구 :

CREATE TABLE [dbo].[Fixture](
    [FixtureID] INT NOT NULL PRIMARY KEY, 
    [WeekNumber] TINYINT NOT NULL, 
    [FixtureDate] DATE NULL, 
    [HomeTeamID] TINYINT NULL, 
    [HomeScore] INT NULL, 
    [AwayTeamID] TINYINT NULL, 
    [AwayScore] INT NULL, 
    [HomeTeamResult] CHAR(1) NULL, 
    [AwayTeamResult] CHAR(1) NULL, 
    [LeagueID] TINYINT CONSTRAINT FK_Fixture_League FOREIGN KEY REFERENCES League(LeagueID) 
) 

TeamWeighting :

다음은 617,451,515,
WITH pl AS (SELECT DISTINCT p.PlayerID 
          ,p.Position 
          ,CASE WHEN p.TeamID = 0 THEN 0 
            ELSE p.playerWeighting END AS playerWeighting 
          ,ABS(CHECKSUM(NewID())) % 10 + 1 AS Form 
          ,t.TeamID 
      FROM dbo.Fixture f 
      INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID 
      INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID 
      INNER JOIN dbo.Player p ON t.TeamID = p.TeamID 
      WHERE f.WeekNumber = 1) 
,po AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY pl.TeamID, pl.Position ORDER BY NEWID()) AS Rnk FROM pl) 
SELECT TeamID 
    ,SUM(po.playerWeighting) AS TeamWeight 
    ,Form--ABS(CHECKSUM(NewID())) % 10 + 1 AS Form 
    ,SUM(po.playerWeighting/10 * Form + po.playerWeighting) AS FinalTeamWeight 
FROM po 
WHERE (po.Position = 'GK' and po.rnk = 1) OR 
     (po.Position = 'DF' and po.rnk <= 4) OR 
     (po.Position = 'MF' and po.rnk <= 4) OR 
     (po.Position = 'FW' and po.rnk <= 2) 
     GROUP BY po.TeamID 

는 TeamScore입니다 :

;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() 
) 

최신 CODE :

;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 
      CASE 
      WHEN c.TeamScore BETWEEN HomeWeighting AND AwayWeighting AND HomeScore > AwayScore AND s.ScoreDifference = Sr.ScoreDifference 
       THEN S.ScoreID 
      WHEN c.TeamScore BETWEEN AwayWeighting AND HomeWeighting AND HomeScore < AwayScore AND s.ScoreDifference = Sr.ScoreDifference 
       THEN S.ScoreID 
      WHEN c.TeamScore BETWEEN HomeWeighting AND AwayWeighting AND HomeScore = AwayScore AND s.ScoreDifference = Sr.ScoreDifference 
       THEN S.ScoreID 
      END 
     --CASE WHEN TeamScore BETWEEN 11 AND 25 --Home Team Wins by 1 goal 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 1 ORDER BY NEWID()) 
     -- WHEN TeamScore BETWEEN 26 AND 40 --Home Team Wins by 2 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 2 ORDER BY NEWID()) 
     -- WHEN TeamScore BETWEEN 41 AND 55 --Home Team Wins by 3 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 3 ORDER BY NEWID()) 
     -- WHEN TeamScore BETWEEN 56 AND 70 --Home Team Wins by 4 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 4 ORDER BY NEWID()) 
     -- WHEN TeamScore > 71 --Home Team Wins by 5 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore > AwayScore AND ScoreDifference = 5 ORDER BY NEWID()) 
     -- WHEN TeamScore BETWEEN -25 AND -11 --Away Team Wins by 1 goal 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -1 ORDER BY NEWID()) 
     -- WHEN TeamScore BETWEEN -40 AND -26 --Away Team Wins by 2 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -2 ORDER BY NEWID()) 
     -- WHEN TeamScore BETWEEN -55 AND -41 --Away Team Wins by 3 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -3 ORDER BY NEWID()) 
     -- WHEN TeamScore BETWEEN -70 AND -56 --Away Team Wins by 4 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -4 ORDER BY NEWID()) 
     -- WHEN TeamScore <= -71 --Away Team Wins by 5 goals 
     -- THEN (SELECT TOP 1 ScoreID FROM dbo.Score WHERE HomeScore < AwayScore AND ScoreDifference = -5 ORDER BY NEWID())  
    -- ELSE (SELECT TOP 1 ScoreID FROM dbo.Score WHERE ScoreDifference = 0 ORDER BY NEWID()) -- Draw 
    FROM dbo.Score s 
    LEFT JOIN dbo.ScoreReference sr 
    ON s.sr.ScoreReferenceId = sr.ScoreReferenceId 
) 
    FROM cte c 
) AS ScoreResult 
    ON f.FixtureID = ScoreResult.FixtureID 
--INNER JOIN Score s 
-- ON score.ScoreID = s.ScoreID 

예상 출력 :

enter image description here

+0

점수 표에는 ScoreReferenceTable과의 연결이 있습니까? 외래 키일 수 있습니다.점수 표의 일부 샘플 데이터가 도움이됩니다. – Sam

+0

@ 샘 나는 실제로 sCore와 ScoreReference 사이에 referecne을 제공합니다. 어쩌면 그것은 내 부분에 논리 실패이며 나는 그것을해야합니다. 지금 ScoreReferenceID가 ScoreID에 링크되어있는 것을 가장하자. –

+0

@Sam 나는 'Score'테이블과 내가 수행하려고 시도한 것에 대한 설명을 포함하는 질문에 대한 업데이트를 제공했습니다. 자세한 정보가 필요하시면 알려주세요 –

답변

0

난 당신이 무슨 말을 하려는지 전혀 확실하지 않다 달성하기 위해,하지만 perh 다음과 같은 aps는 모든 결과에 대해 ScoreDifference 일치가 보장되는 경우 도움이됩니다.

예를 들어 샘플 데이터 세트 등을 사용하여 구체적인 예를 제공 할 수 있습니까?

+0

@Yobix 질문에 대한 업데이트를 제공했습니다. '점수'표와 내가 성취하고자하는 것에 대한 설명이 포함되어 있습니다. 더 많은 정보가 필요하면 알려주세요. –

0

이 줄을 따라 뭔가를 시도해 볼 수 있습니다. 데이터가 없기 때문에 일부 테이블에서는 체크 아웃 할 수 없습니다. 그러나 몇 가지 조작으로이 작업을 시도해보고 알려주십시오.

SELECT 
    c.TeamScore 
    ,( SELECT 
      CASE 
      WHEN c.TeamScore BETWEEN HomeWeighting AND AwayWeighting AND HomeScore > AwayScore AND S.ScoreDifference = SF.ScoreDifference 
       THEN S.ScoreID 
      WHEN c.TeamScore BETWEEN AwayWeighting AND HomeWeighting AND HomeScore < AwayScore AND S.ScoreDifference = SF.ScoreDifference 
       THEN S.ScoreID 
      END 
     FROM dbo.Score S 
     LEFT JOIN dbo.ScoreReference SF 
      ON S.SF.ScorereferenceId = SF.ScorereferenceId 
     ) 
FROM cte c 
+0

일하러 가면 샘 한 시간을 드리겠습니다. 샘, 고마워요. –

+0

안녕하세요 샘, 대답과 함께 몇 가지 비틀기를 시도했지만 여전히 작동시키지 못했습니다. 최신 코드를 게시했습니다. 문제가 있습니까? –

+0

현재 출력과 종류가 예상되는 출력을 볼 수 있으므로 잘못 된 생각이 조금 나옵니까? – Sam

관련 문제