2014-01-18 30 views
2

這是一個微不足道的例子,但我想了解如何創造性地使用SQL進行思考。SQL:如何在不使用HAVING或COUNT的情況下查找出現次數?

例如,我有下面的表格,我想查詢誰有三個或更多questionsfolks的名稱。如何在不使用HAVINGCOUNT的情況下執行此操作?我想知道這是可能的使用JOINS或類似的東西嗎?

FOLKS

folkID  name 
---------- -------------- 
01   Bill 
02   Joe 
03   Amy 
04   Mike 
05   Chris 
06   Elizabeth 
07   James 
08   Ashley 

問題

folkID  questionRating questionDate 
---------- ----------  ---------- 
01   2    2011-01-22 
01   4    2011-01-27 
02   4 
03   2    2011-01-20 
03   4    2011-01-12 
03   2    2011-01-30 
04   3    2011-01-09 
05   3    2011-01-27 
05   2    2011-01-22 
05   4 
06   3    2011-01-15 
06   5    2011-01-19 
07   5    2011-01-20 
08   3    2011-01-02 
+0

這是一個有趣的問題。儘管如此,我並不認爲聯盟在這方面很重要。 – Zarathuztra

+1

你可以使用'CASE'和'SUM'來模擬'COUNT'嗎? –

回答

3

使用SUMCASE似乎是在欺騙我!

我不知道是否有可能在目前的提法,但如果添加一個主鍵的問題表(questionid)那麼下面似乎工作:

SELECT DISTINCT Folks.folkid, Folks.name 
FROM ((Folks 
    INNER JOIN Question AS Question_1 ON Folks.folkid = Question_1.folkid) 
    INNER JOIN Question AS Question_2 ON Folks.folkid = Question_2.folkid) 
    INNER JOIN Question AS Question_3 ON Folks.folkid = Question_3.folkid 
WHERE (((Question_1.questionid) <> [Question_2].[questionid] And 
     (Question_1.questionid) <> [Question_3].[questionid]) AND 
     (Question_2.questionid) <> [Question_3].[questionid]); 

對不起,這是MS Access的SQL,但它應該轉化爲任何味道的SQL。

返回:

folkid name 
3  Amy 
5  Chris 

更新:只是爲了解釋爲什麼這個工程。每個加入都將返回該人員提出的所有問題ID。 where子句然後只留下唯一的問題id行。如果問題少於三個,則不會有唯一的行。

例如,比爾:

folkid name Question_3.questionid Question_1.questionid Question_2.questionid 
1  Bill 1      1      1 
1  Bill 1      1      2 
1  Bill 1      2      1 
1  Bill 1      2      2 
1  Bill 2      1      1 
1  Bill 2      1      2 
1  Bill 2      2      1 
1  Bill 2      2      2 

沒有行,所有的ID不同。

然而

艾米:

folkid name Question_3.questionid Question_1.questionid Question_2.questionid 
3  Amy 4      4      5 
3  Amy 4      4      4 
3  Amy 4      4      6 
3  Amy 4      5      4 
3  Amy 4      5      5 
3  Amy 4      5      6 
3  Amy 4      6      4 
3  Amy 4      6      5 
3  Amy 4      6      6 
3  Amy 5      4      4 
3  Amy 5      4      5 
3  Amy 5      4      6 
3  Amy 5      5      4 
3  Amy 5      5      5 
3  Amy 5      5      6 
3  Amy 5      6      4 
3  Amy 5      6      5 
3  Amy 5      6      6 
3  Amy 6      4      4 
3  Amy 6      4      5 
3  Amy 6      4      6 
3  Amy 6      5      4 
3  Amy 6      5      5 
3  Amy 6      5      6 
3  Amy 6      6      4 
3  Amy 6      6      5 
3  Amy 6      6      6 

有哪些具有不同的ID,因此這是用來取得上述查詢返回的幾行。

+0

+1 @zelanix很直觀.... FYI,我用sum cuz的問題沒有排除使用SUM :) – zee

0

你可以嘗試總和,更換計數。

SELECT SUM(CASE WHEN Field_name >=3 THEN field_name ELSE 0 END) 
    FROM tabel_name 
0
SELECT f.* 
    FROM (
     SELECT DISTINCT 
      COUNT(*) OVER (PARTITION BY folkID) AS [Count] --count questions for folks 
      ,a.folkID 
     FROM QUESTION AS q 
    ) AS p 
    INNER JOIN FOLKS as f ON f.folkID = q.folkID 
    WHERE p.[Count] > 3 
+0

你明確使用'COUNT'。重點是什麼? –

相關問題