簡體   English   中英

SQL查詢來計算某些值在多行中出現的次數

[英]SQL query to count number of times certain values occur in multiple rows

假設我有一張選舉數據表,稱為“選舉”,每次選舉每個選民都有一行,如下所示:

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;

更新:這是我在這里的第一個問題,而我對人們的幫助和快感感到震驚。 我修改了上面的查詢,以解決最后缺少別名並添加終止分號的問題。

謝謝!

是。 你所擁有的應該工作。 (您將需要在派生表上添加一個別名,您得到的錯誤消息應該是不言自明的。易於修復,只需在查詢末尾添加一個空格和字母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

我認為這應該可行,但我不是很肯定...(不記得是否可以在這樣的COUNT中使用COUNT )。 讓我知道?

SELECT COUNT(*)
FROM ELECTIONS e1, ELECTIONS e2
WHERE e1.VoterID = e2.VoterID
    AND e1.ElectionID = 1
    AND e2.ElectionID = 2;

我會建議更像這樣的東西:

SELECT COUNT(*) AS NumVoters
FROM ELECTIONS e1
WHERE e1.ElectionID = 1
AND e1.VoterID in (
    SELECT e2.VoterID
    FROM ELECTIONS e2
    WHERE e2.ElectionID = 2
);

這樣,您就可以解決問題,並且只有1個子查詢。

SELECT COUNT(*)  
  FROM 
     ( SELECT voterid 
         FROM votes 
        WHERE electionid IN(1,2) 
        GROUP 
           BY voterid 
       HAVING COUNT(*) = 2
     ) x;

假設您在(voterid,electionid)上形成了UNIQUE或PRIMARY KEY

這很簡單,如下所示

SELECT voterid, COUNT(DISTINCT electionid) AS electioncount
FROM table
WHERE electionid IN (1, 2) /* substitute elections you are interested in here */
GROUP BY voterid
HAVING electioncount = 2 /* substiture number of election listed in where condition above

結果集的大小將提供符合您的條件的選民數量(即沒有理由匯總更多的選民(即像子選擇一樣)以獲取該數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM