내 사례 문에서 하드 코딩 된 값을 사용하는 대신 룩업 테이블을 사용하여 경계를 결정하고 싶습니다. 나는 어떤 종류의 룩업 테이블도하지 않았으므로 단지 다음을 코딩하는 방법에 대한 지침을 원했다.하드 코딩 된 값을 찾아보기 테이블로 바꾸기
가 어떻게 하드 코딩 된 값을 대체 할 내 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
업데이트 :
다음은 '점수'테이블 : 당신은 내가 뭘하려고 오전 볼 수 있듯이
은 각 팀의 가중치에 따라 (한 팀 가중치는 홈팀이고 다른 하나는 어웨이 팀 '입니다), 가중치의 차이는 점수에 반영됩니다. 예 양 팀 간의 가중치가 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
예상 출력 :
점수 표에는 ScoreReferenceTable과의 연결이 있습니까? 외래 키일 수 있습니다.점수 표의 일부 샘플 데이터가 도움이됩니다. – Sam
@ 샘 나는 실제로 sCore와 ScoreReference 사이에 referecne을 제공합니다. 어쩌면 그것은 내 부분에 논리 실패이며 나는 그것을해야합니다. 지금 ScoreReferenceID가 ScoreID에 링크되어있는 것을 가장하자. –
@Sam 나는 'Score'테이블과 내가 수행하려고 시도한 것에 대한 설명을 포함하는 질문에 대한 업데이트를 제공했습니다. 자세한 정보가 필요하시면 알려주세요 –