2017-04-18 6 views
0

まず最初にこれが最悪の事だと知っていますが、オフチャンスで誰かがこれについてどうやって行くのか考えています。テーブル内のグループのランダムな値を引き出すMSAccess/sql

主な質問:データ内のグループの量に基づいてランダムな値を生成するにはどうすればよいですか?

例:

tblBill 
ID FirstName Bill Tax Group 
1  Mark $40 $6 1 
2  Fred $25 $2 1 
3  Jane $25 $2 1 
4  Brad $40 $6 2 
5  Amy $25 $2 2 
6  Pat $25 $2 2 
7  Lilly $25 $2 2 

私が欲しい:

[グループ1のためにランダムな名前]

[グループ2のためにランダムな名前]

私の現在の(悪い)ソリューション:

2つのクエリを作成:

ID FirstName 
3 Jane 
6 Pat 

(と、それはリフレッシュにランダム化されます)

しかし、私はちょうど2グループ以上のものを持っている、方法がある:

SELECT qryRnd1.[ID], qryRnd1.[FirstName] from qryRnd1 
UNION ALL SELECT qryRnd2.[ID], qryRnd2.[FirstName] from qryRnd2; 

は私与える:

QryRand1 
    SELECT TOP 1 tblBill.FirstName, tblBill.ID 
    FROM tblBill 
    WHERE tblBill.Group=1 
    ORDER BY Rnd(ID); 

QryRand2 
    SELECT TOP 1 tblBill.FirstName, tblBill.ID 
    FROM tblBill 
    WHERE (((tblBill.Group)='2')) 
    ORDER BY Rnd(ID); 

組合を作成存在するn個のグループのそれぞれに対してランダムな値を生成するテーブルを作成しますか?

私が30のグループを持っていた場合、それぞれのグループに対してqryを作成してから30のクエリを結合する必要がありますか?これは唯一の解決策ですか? ROW_NUMBER()は、各グループの各レコードの行番号を生成しているし、それがその行をランダムだと

SELECT * 
FROM 
    (
     SELECT tblBill.FirstName, 
      tblBill.ID, 
      ROW_NUMBER() OVER (PARTITION BY group ORDER BY NewID()) as randomRow 
     FROM tblBill   
    ) as sub 
WHERE sub.randomRow = 1 

+0

AccessまたはSQL Serverを使用していますか?彼らは同じことではありません。 –

+0

アクセスが必要ですが、テーブルをSQLサーバーに移動することができます – arsarc

+0

ここでは2つの異なる質問があるようです。 1つはランダムな行を取得する方法、もう1つはグループ間で値を分割する方法です。実際の質問は何ですか?いくつかのddl、サンプルデータ、および望ましい出力を投稿すれば、これはもっとはっきりと分かります。 –

答えて

1

あなたはサブクエリを使用できます。タイマーを使う

SELECT tblBill.Group, tblBill.FirstName 
FROM tblBill 
WHERE tblBill.ID IN 
    (SELECT TOP 1 T.ID 
    FROM tblBill As T 
    WHERE T.Group = tblBill.Group 
    ORDER BY Rnd(-Timer() * [ID])) 

を( )は、Accessを起動してクエリを実行するたびに、同じ選択を得ることを防ぎます。

1

は、私はあなたが画面の機能を利用することができるので、あなたがこのSQL Server上ではるかに簡単に見つけることだと思います数字はNewID()です。外側のクエリは、そのウィンドウ関数から「1」を取得したレコードを取得します。ここで

1

は、私はあなたのデータを使用して、上記議論されたもののSQL Serverバージョンのためのいくつかのサンプルコードです:Accessで

CREATE TABLE #tmp (id int not null, 
    name varchar(20) not null, 
    Amt1 Money not null, 
    Amt2 Money not null, 
    GroupID int not null 
    ) 

INSERT INTO #tmp Values 
(1,  'Mark', $40, $6, 1), 
(2,  'Fred', $25, $2, 1), 
(3,  'Jane', $25, $2, 1), 
(4,  'Brad', $40, $6, 2), 
(5,  'Amy', $25, $2, 2), 
(6,  'Pat', $25, $2, 2), 
(7,  'Lilly', $25, $2, 2) 

SELECT [Name], 
    GroupID 
FROM (
    SELECT [name], 
     ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY NewID()) as x, 
     GroupID 
    FROM #tmp t) src 
WHERE x = 1 
+0

Aaaand ....私はすでに@jnevillが上に同じコードを効果的に掲載しているのを見ています。 –

関連する問題