SQL:如何在不使用HAVING或COUNT的情况下查找出现次数?

时间:2014-01-18 02:01:27

标签: sql

这是一个简单的例子,但我试图理解如何使用SQL创造性思考。

例如,我在下面有以下表格,并且我想查询具有三个或更多folks的{​​{1}}的名称。如何在不使用questionsHAVING的情况下执行此操作?我想知道这是否可以使用COUNT或类似的东西?

FOLKS

JOINS

问题

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

3 个答案:

答案 0 :(得分: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,因此上述查询会返回这些行。

答案 1 :(得分:0)

你可以尝试总和,以取代计数。

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name

答案 2 :(得分: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