我有两个表,我试图计算特定'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
答案 0 :(得分: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;
在进行连接之前,您需要按id
进行聚合,以确保没有重复项。子查询获得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行。
答案 1 :(得分: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
输出:
| FIRSTNAME | OCCURRENCES | --------------------------- | Mat | 5 |
这是 SQLFiddle 演示