7

テーブル構造を想定します。

Create Table Question
{
ID int pk,
Category varchar
Stem varchar,
AnswerA varchar,
...
AnswerD varchar,
Correct char,
isMandatory bit

}

特定のカテゴリについて、約50の質問があります。1〜10の必須の質問があります。

すべての必須の質問を選択し、次に20の質問の質問セットを作成するのに十分な他の質問をランダムに選択する必要があります。

4

3 に答える 3

7

これはどうですか

select top 20 * from question
where category = @category
order by isMandatory desc, newid()

newid()の背後にある理由については、受け入れられた回答を参照してください。データベーステーブルからのランダムレコード(T-SQL)

于 2012-06-03T19:12:23.557 に答える
6
;WITH T 
     AS (SELECT *, 
                ROW_NUMBER() 
                  OVER (PARTITION BY Category 
                            ORDER BY isMandatory DESC, CRYPT_GEN_RANDOM(4)) RN 
         FROM   Question) 
SELECT * 
FROM   T 
WHERE  RN < = 20 
于 2012-06-03T19:12:27.227 に答える
0
   Declare @number_of_nonmandat INT

   Select @number_of_nonmandat=count(1)
   FROM Question
   where isMandatory =1

   SET @number_of_nonmandat=20-number_of_nonmandat;

    IF(@number_of_nonmandat>0)
    BEGIN
         Select *
         FROM Question
         where isMandatory =1
           UNION 
         SELECT TOP (@number_of_nonmandat)  *
         FROM Question
         where isMandatory<>1
         ORDER BY newID()
    END
    ELSE 
    BEGIN
        Select top 20 *
         FROM Question
         where isMandatory =1

    END
于 2012-06-03T19:07:14.333 に答える