Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅返回具有多个正确选择的结果_Sql_Sql Server_Having - Fatal编程技术网

Sql 仅返回具有多个正确选择的结果

Sql 仅返回具有多个正确选择的结果,sql,sql-server,having,Sql,Sql Server,Having,我需要提出一个查询,显示哪些问题有多个正确答案。我一直在找,但找不到我需要的东西。我找到了这个,这是我想要的,但它对我不起作用,也许我做错了 这是我到目前为止所拥有的 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

我需要提出一个查询,显示哪些问题有多个正确答案。我一直在找,但找不到我需要的东西。我找到了这个,这是我想要的,但它对我不起作用,也许我做错了

这是我到目前为止所拥有的

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行的error 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

您只需要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

你如何确定一个选择是正确的?你需要这样的东西:

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上的问题以获得所有选项(您可能需要返回选择)。

根据您的评论和初始问题,这似乎适用于您:

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);

结果是:

| ITEMID | REVNUM | SEQUENCE | CORRECT |
----------------------------------------
|  12778 |      1 |        A |       1 |
|  12778 |      1 |        B |       1 |
|  12778 |      1 |        C |       0 |
|  12778 |      1 |        D |       1 |

我不希望只有correct为1的记录,它不应该在where子句中。我只希望有多个正确选项的记录。你上面所说的绝对不能做到这一点。