2016-06-28 5 views
1

LeagueID 2の上位2チームがLeagueID 1に移動し、下位2チームがLeagueID 1に移動し、LeagueID 2に移動する2つのリーグの間で昇格と降格を作成したいと考えています。特定の行を選択する方法

私の質問は、リーグごとのチームの数が将来変更される可能性があるので、それらのチームを選ぶ方法です。チームを降格させるためにwhere句を使用することはできません。私はLeagueID 2からポジション1と2のプロモーションに問題のないwhere句を使用できますが、selectとcountから実行する方法がある場合は、そのメソッドも同様に実行します。

正しいチームを選んだときに必要なのは、LeagueIDを更新するだけです。

enter image description here

LATEST UPDATE:

UPDATE dbo.League 
SET LeagueId = 2 
WHERE LeagueId = 1 
AND Position IN 
(
    SELECT TOP 2 Position 
    FROM dbo.League_Table 
    WHERE LeagueID = 1 
    ORDER BY Position DESC 
) 

UPDATE dbo.League 
SET LeagueId = 1 
WHERE LeagueId = 2 
AND Position IN 
(
    SELECT TOP 2 Position 
    FROM dbo.League_Table 
    WHERE LeagueID = 2 
    ORDER BY Position 
) 

'チーム' 表:この表は、すべてのチームのための参照であり、彼らが演じるリーグ:

CREATE TABLE [dbo].[Team] 
(
    [TeamID] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [TeamAbbreviation] CHAR(3) UNIQUE, 
    [TeamName] VARCHAR(50) UNIQUE, 
    [LeagueID] TINYINT CONSTRAINT FK_Team_League FOREIGN KEY REFERENCES League(LeagueID), 
    [CountryID] TINYINT CONSTRAINT FK_Team_Country FOREIGN KEY REFERENCES Country(CountryID) 
) 

リーグ 'テーブル:すべてのリーグへの参照:

CREATE TABLE [dbo].[League] 
(
    [LeagueID] TINYINT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [LeagueName] VARCHAR(30) UNIQUE, 
    [MinLeagueWeight] INT, 
    [MaxLeagueWeight] INT, 
    [CountryID] TINYINT CONSTRAINT FK_League_Country FOREIGN KEY REFERENCES Country(CountryID), 
    [ParentLeagueID] TINYINT CONSTRAINT FK_League_ParentLeague FOREIGN KEY REFERENCES League(LeagueID) 
) 

「League_Table」テーブル:これはリーグテーブル(上のスクリーンショットに見られるように)ビューから構成されています

SELECT [Position], [TeamName], [Played], [Wins], [Loss], [Draws], [Points], [Goals_Scored], [Goals_Against], [Goal_Difference], [LeagueID] 
FROM League_Table 
+0

実質的に今シーズンリーグ1の12チームとリーグ2の12チームがありますが、次のシーズンはリーグを拡大したいと言っています(例えば14)、前のシーズンとは異なるチームポジションを探していますチーム11と12を探していますが、次のシーズンは13と14です –

+0

トップ2チームとボトム2チームはどのように定義しますか?トップとボトムになる条件は何ですか? –

+0

@ KaiserNayan最初の2つのポジションはトップで、最後の2つはボトムです。 – Jamiec

答えて

0

あなたは関係なく

がありますどのように多くの、下の二つのため降順ことはできません
SELECT TOP 2 * 
FROM Teams 
WHERE LeagueID = 1 
ORDER BY Position DESC 


(追記イムは、あなたがそれを維持する場合は、データの整合性に影響を与える可能性があり、そのため、あなたの Positionフィールドは、計算されることを望ん)

あなたの2つのクエリはうまくいき、可能な場合でもそれらを1つに結合することはあまり明確ではありません。単一のクエリで、この時間を - あなたは、単にサブクエリ

UPDATE dbo.League 
SET LeagueId = 2 
WHERE LeagueId = 1 
AND Position IN 
(
    SELECT TOP 2 Position 
    FROM dbo.League 
    WHERE LeagueID = 1 
    ORDER BY Position DESC 
) 

UPDATE dbo.League 
SET LeagueId = 1 
WHERE LeagueId = 2 
AND Position IN 
(
    SELECT TOP 2 Position 
    FROM dbo.League 
    WHERE LeagueID = 2 
    ORDER BY Position 
) 

もう一つは、これを試してください

WHERE句を逃しています。テストケースを提供するためのH/T〜@ Jens

あなたが最初にすべてのチームのリーグの位置の変更方法を作業する場合:

SELECT LeagueID, TeamName, case 
    when league>1 AND RANK() OVER (PARTITION BY league ORDER BY position ASC) <= 2 THEN -1 
    when league<2 AND RANK() OVER (PARTITION BY league ORDER BY position DESC) <= 2 THEN 1 
    else 0 
end as leaguechange 
FROM dbo.League_Table 

は(私はそこに余分な2節に入れている注 - チームを停止するにはリーグ0とleague<2に昇格されているチームを停止するleague>1リーグ3に降格されている - これらの両方)に応じて調整することができ、あなたがいること、それは単一UPDATE内サブクエリとして使用することができたら

UPDATE dbo.Team 
SET LeagueID = LeagueID + leaguechange 
FROM (
    SELECT LeagueID, TeamName, case 
     when league>1 AND RANK() OVER (PARTITION BY leagueID ORDER BY position ASC) <= 2 THEN -1 
     when league<2 AND RANK() OVER (PARTITION BY leagueID ORDER BY position DESC) <= 2 THEN 1 
     else 0 
    end as leaguechange 
    FROM dbo.League_Table 
) c 
INNER JOIN dbo.Team t 
ON c.LeagueId = t.LeagueID 
AND c.TeamName = t.TeamName 
+0

私はあなたのselectステートメントを使って更新ステートメント内に更新ステートメントを投稿しました。私は2つの更新ステートメントを持っていますが、これを1つに組み合わせることができるかどうかを知りたいだけでしたか? –

+0

@DazzleVisionなぜそれを1つのステートメントにする必要がありますか?それは2つのIMOとしては大丈夫です – Jamiec

+0

それはいいです、私はそれを行うより短い方法があるかどうかわかりませんでした。私はそれを実行していないようだが、更新プログラムには少し問題がある。各チームにはLeagueIDが割り当てられていますが、更新する必要がありますが、問題はWHERE句です。その場合、迅速にチェックしていただけますか? –

0
UPDATE League 
SET LeagueId = 2, 
    Position = NULL 
WHERE LeagueId = 1 
AND Position IN 
(
    SELECT TOP 2 Position 
    FROM League 
    ORDER BY Position DESC 
) 

あなたは降格やプロモーションのための更新文を結合したい場合は、この使用することができますあなたが動的に別のリーグの上にこれを持っているしたい場合は

WITH NewLeague AS 
(
    SELECT NewLeagueId = CASE WHEN LeagueId = 1 THEN 2 ELSE 1 END, * 
    FROM dbo.League 
    WHERE 
    (
    LeagueId = 1 
    AND Position IN 
    (
     SELECT TOP 2 Position 
     FROM dbo.League 
     ORDER BY Position DESC 
    ) 
    ) 
    OR 
    (
    LeagueId = 2 
    AND Position IN 
    (
     SELECT TOP 2 Position 
     FROM dbo.League 
     ORDER BY Position ASC 
    ) 
    ) 
) 
UPDATE NewLeague 
SET LeagueId = NewLeagueId 
+0

答えをありがとう、ちょっとした質問があります。私は2つの更新声明があり、1つは降格のためのものであり、もう1つは昇進のためのものです。これらの更新ステートメントを1つに結合する方法はありますか? –

+0

@DazzleVision:1つの更新ステートメントのアプローチを提供 –

+0

クールティム、実行するのは問題があるということだけです:ビューまたは関数 'NewLeague'に集計、DISTINCTまたはGROUP BY句、PIVOTまたはUNPIVOTが含まれているため更新できませんオペレーター。 –

1

をあなたはまた、RANKで動作することができます():

DECLARE @TABLE TABLE(league int, name varchar(10), position int); 

INSERT INTO @TABLE 
VALUES (1, 'Team A', 1), 
     (1, 'Team B', 2), 
     (1, 'Team C', 3), 
     (1, 'Team D', 4), 
     (1, 'Team E', 5), 
     (1, 'Team F', 6), 
     (1, 'Team G', 7), 
     (1, 'Team H', 8), 
     (1, 'Team I', 9), 
     (1, 'Team J', 10), 
     (1, 'Team K', 11), 
     (2, 'Team A', 1), 
     (2, 'Team B', 2), 
     (2, 'Team C', 3), 
     (2, 'Team D', 4), 
     (2, 'Team E', 5), 
     (2, 'Team F', 6), 
     (2, 'Team G', 7), 
     (2, 'Team H', 8), 
     (2, 'Team I', 9), 
     (2, 'Team J', 10), 
     (2, 'Team K', 11); 

SELECT league, name, position 
FROM (SELECT * 
      , RANK() OVER (PARTITION BY league ORDER BY position ASC) AS TopRank 
      , RANK() OVER (PARTITION BY league ORDER BY position DESC) AS BottomRank 
     FROM @TABLE) RankedResults 
WHERE TopRank <= 2 
    OR BottomRank <= 2; 

結果:

league  name  position 
----------- ---------- ----------- 
1   Team K  11 
1   Team J  10 
1   Team B  2 
1   Team A  1 
2   Team K  11 
2   Team J  10 
2   Team B  2 
2   Team A  1 

編集:TopRankedフィールドは、位置をフィルタリングできるだけではなく、明らかに私のアプローチの説明のような目的を果たします。

関連する問題