小编典典

SQL查询来计算某些值在多行中出现的次数

sql

假设我有一张选举数据表,称为选举,每个选举每个选民都有一行,如下所示:

VoterID ElectionID
A           1
A           2
B           1
C           2
D           3
E           1
E           2

我想知道在选举1和选举2中都投票的选民人数;我不在乎别人 该数字应为2(选民A和选民E)。

这样的事情会做:

select count(Elections) as NumVoters
from (
select VoterID, ElectionID, count(ElectionID) as Elections
from ELECTIONS
where ElectionID=1 or ElectionID=2
group by VoterID
having (count(ElectionID)=2)
) x;

更新:这是我在这里的第一个问题,我被那些热心而又快速的人们所震撼。我修改了上面的查询,以解决最后缺少别名并添加终止分号的问题。

谢谢你!


阅读 156

收藏
2021-04-14

共1个答案

小编典典

是的。你所拥有的应该工作。(您将需要在派生表上添加一个别名,您得到的错误消息应该是不言自明的。易于修复,只需在查询末尾添加一个空格和字母c(或您想要的任何名称)即可。

关于重复(VoterID, ElectionID)元组的潜力,有一个警告。

如果您对(VoterID,ElectionID)有唯一的约束,那么您的查询将正常工作。

如果您没有唯一的约束(不允许重复(VoterID, ElectionId)),则可能有一个选民有两(2)行用于ElectionID
1,而没有行用于ElectionID 2 …使该选票包含在计数中。在ElectionID 1中进行了两次投票而在ElectionID
2中仅进行了一次投票的选民,该选民将从计数中排除。

在COUNT内包含DISTINCT关键字可以解决该问题,例如

HAVING COUNT(DISTINCT ElectionID) = 2

我会以不同的方式编写查询,但是您所拥有的将起作用。

为了获得参与ElectionID
1和ElectionID2的VoterID的数量,以提高性能,我避免使用内联视图(MySQL称其为派生表)。我会让查询改为使用JOIN操作。像这样的东西:

SELECT COUNT(DISTINCT e1.voterID) AS NumVoters
  FROM elections e1
  JOIN elections e2
    ON e2.voterID = e1.voterID
 WHERE e1.electionID = 1
   AND e2.electionID = 2

如果保证(voterID, ElectionID)唯一,那么选择可能会更简单:

SELECT COUNT(1) AS NumVoters
  FROM elections e1
  JOIN elections e2
    ON e2.voterID = e1.voterID
 WHERE e1.electionID = 1
   AND e2.electionID = 2
2021-04-14