2011-07-28 7 views
1

I次の表がありますいくつかのテスト値でT-SQLでのラッフルチケットの勝者を描画

DECLARE @TicketHolder TABLE 
(
    [Name] VARCHAR(100), 
    Tickets DECIMAL(18, 8) 
); 

INSERT INTO @TicketHolder ([Name], Tickets) 
SELECT 'Bob', 10.37 
UNION ALL 
SELECT 'Lisa', 1 
UNION ALL 
SELECT 'Robbie', 150.981 
UNION ALL 
SELECT 'Cathy', 97.888531; 

260.239531チケットが購入されていますが。ボブはチケットの〜58%を所有している、キャシー〜38%、およびその上:

SELECT [Name], Tickets/(SELECT SUM(Tickets) AS WinProb 
FROM @TicketHolder) WinProb FROM @TicketHolder 

今、私は1つを選択する必要があり、唯一のランダム勝者何に基づいて(RANDを(使用)は十分です)各人が所有するチケット。何百万もの行がある可能性があるので、ループは疑問から外れています。勝者はT-SQLを使ってどのように描くことができますか?

rand() * (select sum(tickets) from @TicketHolder) 

あなたは乱数が描かれたブロックの所有者を見つけるために、実行中の合計クエリとそれを組み合わせることができます。

+0

あなたは、チケットごとに1つの行で一時テーブルを作成した場合(ボブなどのためのより多くの行を)買って、あなただけの行を選ぶことができます。 – bzlm

+1

この宿題はありますか? –

答えて

1

このクエリでは、チケットの合計数に基づいて乱数を見つけるだろう。 SEデータに

select top 1 t1.Name 
from @TicketHolder t1 
where (
     select sum(Tickets) 
     from @TicketHolder t2 
     where t2.Name <= t1.Name 
     ) > rand() * (select sum(tickets) from @TicketHolder) 
order by 
     t1.Name 

Example at SE Data.、それは常に彼らは一定の方法でrand()をシードおそらくので、同じ勝者を選択します。私はそれをローカルで実行する場合、それは正常に動作します。

+0

SEデータで非常に素敵なタッチ、ありがとうございます。 – abrkn

0

RunningCount列が含まれるように、あなたのテーブル変数を改正:買ったすべてのチケットの合計を実行している

INSERT INTO @TicketHolder ([Name], Tickets) 
SELECT 'Bob', 10.37 
UNION ALL 
SELECT 'Lisa', 1 
UNION ALL 
SELECT 'Robbie', 150.981 
UNION ALL 
SELECT 'Cathy', 97.888531; 

構築物を、そしてカウントしてテーブルを更新します:

DECLARE @TicketHolder TABLE (  
    [Name] VARCHAR(100),  
    Tickets DECIMAL(18, 8), 
    RunningCount decimal(18,8) 
); 

は、チケットデータを追加

declare @RunningCount decimal(18,8) = 0 

update @TicketHolder 
set 
    @RunningCount = @RunningCount + Tickets, 
    RunningCount = @RunningCount 

当選チケット番号を計算する

declare @WinningCount decimal(18,8) = @RunningCount * rand() 

選択勝者:

select top 1 
    @WinningCount, 
    Name 
from 
    @TicketHolder 
where 
    RunningCount <= @WinningCount 
order by 
    RunningCount desc 
関連する問題