1

どの質問に複数の正解があるかを示すクエリを考え出す必要があります。検索していて、必要なものを正確に見つけることができませんでした。これは私が欲しかったものですが、うまくいきませんでした。

SQL カウント where 句

これが私がこれまでに持っているものです...

SELECT pq.ItemID, pq.RevNum, pc.sequence, pc.correct FROM Choice pc 
JOIN Question pq on pc.UniqueQID = pq.UniqueQID and pc.RevNum = pq.RevNum
Group BY pq.ItemID, pq.RevNum, pc.Sequence, pc.Correct
ORDER BY ItemID, RevNum, Sequence

これは、各質問/リビジョンとそこにあるすべての選択肢のリストを返します。結果はこんな感じ…

ItemID      RevNum  Seq     Correct
12776   1   A   0
12776   1   B   0
12776   1   C   1

12777   1   A   0
12777   1   B   1
12777   1   C   0
12777   1   D   0

12778   1   A   1
12778   1   B   1
12778   1   C   0
12778   1   D   1

8301    3   a   1
8301    3   b   2
8301    3   c   2
8301    3   d   2

8303    3   a   2
8303    3   b   1
8303    3   c   2
8303    3   d   2

わかりやすくするために新しい行を追加しました。選択肢 = 1 が正解、0 または 2 が不正解です。上記の 12778 のように、複数の正解がある問題のみが必要です。

上記のリンクされた記事に基づいて、私はこのようなことを試しましたが、行 4 でエラー near = が表示されてうまくいきませんでした。

SELECT pq.ItemID, pq.RevNum, pc.sequence, pc.correct FROM pubChoice pc 
JOIN pubQuestion pq on pc.UniqueQID = pq.UniqueQID and pc.RevNum = pq.RevNum
Group BY pq.ItemID, pq.RevNum, pc.Sequence, pc.Correct
HAVING Count(correct=1) > 1
ORDER BY ItemID, RevNum, Sequence
4

3 に答える 3

2

correct が 1 のレコードのみが必要なので、それを where 句に追加します。他のグループのこのグループの後に、count(*) を追加すると、その count(*) に having 句を含めることができます。このようなものが動作するはずです:

SELECT pq.ItemID, pq.RevNum, pc.sequence,count(*) FROM pubChoice pc 
JOIN pubQuestion pq on pc.UniqueQID = pq.UniqueQID and pc.RevNum = pq.RevNum
WHERE pc.Correct = 1
Group BY pq.ItemID, pq.RevNum, pc.Sequence
HAVING Count(*) > 1
ORDER BY ItemID, RevNum, Sequence
于 2012-12-13T19:41:28.943 に答える
0

選択が正しいものであるとどのように判断しますか? 次のようなものが必要です。

SELECT pq.*
FROM Question pq
INNER JOIN 
(
SELECT ItemID, COUNT(*) as correctCount
FROM Question q
INNER JOIN Choice c
ON c.UniqueQID = q.UniqueQID 
WHERE ANSWER_IS_CORRECT
GROUP BY ItemID
HAVING COUNT(*) > 1
) mults
ON pq.ItemID = mults.ItemID

私はこれをテストしていませんが、選択が正しいかどうかを判断する方法がある限り、理論的には機能するはずです。複数の正解があるすべての ItemID を返し、ItemID の質問に戻ってすべてのオプションを取得します (選択肢に戻る必要がある場合があります)。

于 2012-12-13T22:54:00.013 に答える
0

あなたのコメントと最初の質問に基づいて、これはあなたにとってうまくいくようです:

SELECT pq.ItemID, 
  pq.RevNum, 
  pc.sequence, 
  pc.correct 
FROM Choice pc 
JOIN Question pq 
  on pc.UniqueQID = pq.UniqueQID 
  and pc.RevNum = pq.RevNum
where exists (select count(*) TotalCorrect, UniqueQID, RevNum
              from choice c
              where correct = 1
                and pc.UniqueQID = c.UniqueQID
                and pc.RevNum = c.RevNum
              group by UniqueQID, RevNum
              having count(*) > 1);

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| ITEMID | REVNUM | SEQUENCE | CORRECT |
----------------------------------------
|  12778 |      1 |        A |       1 |
|  12778 |      1 |        B |       1 |
|  12778 |      1 |        C |       0 |
|  12778 |      1 |        D |       1 |
于 2012-12-14T12:11:25.943 に答える