2016-06-08 18 views
1

我有一個發行只知道如何編寫代碼如下要求的百分比:如何數學產生一個固定值

我的球隊名單,每隊有20名球員。每個球隊的名字由球隊名稱組成,名字是'FirstName','Player ...'是'Surname',在字符串'Player'之後出現一個增量數字(來自'NumberID')。

我想要做的是說,每隊20名球員,必須有在「位置」字段中輸入以下職位:

  • GK(僅適用於2名球員(換句話說玩家10% )
  • DF(僅用於6位玩家(換句話說玩家30%)
  • MF(僅用於6位玩家(換句話說玩家30%)
  • FW(僅用於6位玩家(換言之爲30%球員)

然後根據它們的位置,基於它們的 '位置' 1之間執行隨機 'PlayerWeighting' 爲每個玩家 -

  • GK 100

    - 球員加權的第一3%(0 -3)
  • DF - 4% - 30%球員加權(4 - 30)
  • MF - 31% - 60%玩家加權(31 - 60)
  • FW - 玩家加權61% - 99% 99) 我可以幫忙編碼嗎? 下面是我的時刻,並輸出它產生:

    CREATE PROCEDURE [dbo].[Player_CreateWholeTeam] 
        @TeamID INT 
    
    AS 
    SET NOCOUNT ON 
    BEGIN 
    
    
    
        INSERT INTO dbo.Player (FirstName, Surname, TeamID) 
        SELECT TeamName AS FirstName, 'Player' + cast(NumberID AS VARCHAR (10)) AS Surname, @TeamID 
         FROM dbo.Team t 
         CROSS JOIN dbo.Number n 
         WHERE TeamID = @TeamID 
         AND n.NumberID <= 20 
    
    -- abs(checksum(newid()) % 99) + 1 AS PlayerWeighting, 
    
    select * from dbo.Player 
    
    END 
    

    OUTPUT( '球員' 表):

enter image description here

+0

你是否簡單地給每個玩家分配一個隨機值(從1到100)來達到加權?然後按位置評估?如果一個球員有多個職位會發生什麼? –

+0

是一個隨機值,沒有玩家會有多個職位。它的固定位置 –

+0

您的加權表格描述中包含GK/DF/DF/DF。這可能是錯的? – TToni

回答

1

只需使用一個Searched CASE expression爲剩下的兩個列中SELECT

CASE 
    WHEN n.NumberId BETWEEN 1 AND 2 THEN 'GK' 
    WHEN n.NumberId BETWEEN 3 AND 8 THEN 'DF' 
    ... 
END AS Position, 
CASE 
    WHEN n.NumberId BETWEEN 1 AND 2 THEN ABS(CHECKSUM(NEWID())) % 4 
    WHEN n.NumberId BETWEEN 3 AND 8 THEN ABS(CHECKSUM(NEWID())) % 27 + 4 
    ... 
END AS PlayerWeigthing, 

如果你也想隨機播放器的數字,你必須創建一個隨機映射你的號碼,就像這樣:

DECLARE @RNumber AS TABLE(n int IDENTITY(1,1), rn INT) 

INSERT @RNumber 
    SELECT NumberID as rn FROM dbo.Number 
    WHERE NumberID <= 20 
    ORDER BY CHECKSUM(NEWID()) 

然後你就可以用的,而不是你原來的號碼錶連接,並使用nrn爲需要。

+0

真棒,謝謝你 –