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

SQL:如何在不使用have或COUNT的情况下查找出现次数?,sql,Sql,这是一个微不足道的例子,但我试图理解如何使用SQL进行创造性思考 SELECT SUM(CASE WHEN Field_name >=3 THEN field_name ELSE 0 END) FROM tabel_name 例如,我有以下表格,我想查询有三个或更多问题的人的姓名。如何在不使用have或COUNT的情况下执行此操作?我想知道是否可以使用连接或类似的方法来实现这一点 SELECT SUM(CASE WHEN Field_name >=3 THE

这是一个微不足道的例子,但我试图理解如何使用SQL进行创造性思考

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
例如,我有以下表格,我想查询有三个或更多问题的
人的姓名。如何在不使用
have
COUNT
的情况下执行此操作?我想知道是否可以使用
连接
或类似的方法来实现这一点

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

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

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
  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name

您可以尝试求和,以替换计数

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

使用
SUM
CASE
似乎在欺骗我

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
我不确定在您当前的公式中是否可能,但如果您向问题表(
questionid
)添加主键,则以下操作似乎有效:

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
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]);
更新:只是为了解释为什么这样做有效。每次加入都将返回该人员询问的所有问题ID。where子句只留下唯一的问题ID行。如果询问的问题少于三个,则不会有唯一的行

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
例如,比尔:

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
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都不同的行

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
但是对于艾米来说:

  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
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,因此这些ID由上述查询返回。

这是一个有趣的问题。我真的不认为连接在这里会有多大影响。你能用
CASE
SUM
来模拟
COUNT
?+1@zelanix非常直观……仅供参考,我使用SUM是因为问题没有排除SUM的使用:)
  SELECT   SUM(CASE WHEN Field_name >=3 THEN field_name  ELSE 0 END)
   FROM tabel_name
    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