2

我有两个表,我试图计算特定“ID”出现的次数,然后输出与该“ID”对应的名称。例如,列表中的某些人有多个出现的 ID,我想输出 ID 出现超过 4 次的人。

感谢 bvr,我有了它的一部分,我现在知道如何使用以下语句显示出现超过 4 次的值:

SELECT ID , COUNT(OrderID) FROM Table1
GROUP BY ID
HAVING COUNT(OrderID) > 4

只需要第二部分。

这是两个表的示例。

表格1

ID | OrderID
--------------
191 | 1020
150 | 1090
191 | 1023
140 | 1033
191 | 2132
191 | 1233
191 | 1321

表 2

ID | FirstName
--------------
191 | Mat
150 | Stewart
191 | Mat
140 | John
191 | Mat
191 | Mat
191 | Mat

我想输出这样的东西

Occurrences  | FirstName 
-------------------------
         5   |  Mat
4

2 回答 2

1

您想加入第二个表以获取名称:

SELECT t1.ID , COUNT(t1.OrderID), min(t2.name) as name
FROM Table1 t1 join
     (select id, min(name) as name
      from Table2 t2
      group by id
     ) t2
     on t1.id = t2.id
GROUP BY t1.ID
HAVING COUNT(t1.OrderID) > 4;

但是,在进行联接之前,您需要聚合 byid以确保没有重复项。子查询获取id. 如果所有名称都相同,这将是名称。否则,它是分配给id.

编辑:

您可以在没有子查询的情况下进行查询,但我不确定这会更有效:

SELECT t1.ID , COUNT(distinct t1.OrderID), min(t2.name) as name
FROM Table1 t1 join
     Table2 t2
     on t1.id = t2.id
GROUP BY t1.ID
HAVING COUNT(distinct t1.OrderID) > 4;

这可能看起来更简单,但在性能方面可能要差得多。例如,如果一个 id 在表 1 和表 2 中都有 1000 个匹配项,那么该 id 最终将在连接后处理 1,000,000 行。

于 2013-08-15T00:54:52.163 回答
0

一个版本DISTINCT

SELECT t2.FirstName, COUNT(*) Occurrences 
  FROM Table1 t1 JOIN 
(
  SELECT DISTINCT id, firstname
    FROM Table2
) t2
    ON t1.ID = t2.ID
 GROUP BY t2.ID, t2.FirstName
 HAVING COUNT(*) > 4

输出:

| 名字 | 事件 |
--------------------------
| 垫子 | 5 |

这是SQLFiddle演示

于 2013-08-15T00:54:55.007 回答