2013-08-15 4 views
2

두 테이블이 있는데 특정 ID가 발생하는 횟수를 세고 그 ID와 일치하는 이름을 출력하려고합니다. 예를 들어 목록에있는 특정 사람들은 여러 번 발생하는 ID를 가지고 있으며 ID가 4 번 이상 나오는 사람들을 출력하고 싶습니다. BVR에두 테이블 간의 참조 SQL?

감사합니다, 나는 그것의 한 부분이, 지금 다음 문을 사용하여, 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

왜 표 2는 모든 중복 라인을 가지고 있습니까? 스키마를 표준화해야합니다. – Barmar

+0

더 많은 열이 있어도 같은 관계를 반복하지 않도록 테이블을 표준화해야합니다. ID-> 이름 관계는 고유 한 다른 테이블에 있어야합니다. 이렇게하면 Gordon Linoff의 대답처럼 하위 쿼리를 사용할 필요가 없습니다. – Barmar

답변

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 데모

+0

표 2를 집계하지 않으므로 'COUNT (*)'에 해당 테이블의 중복이 곱해집니다. – Barmar

+0

@Barmar 박람회. 그 점을 지적 해 주셔서 감사합니다. 답변을 업데이트했습니다. – peterm

+0

좋습니다. 그것은 밖에 있어야합니다. 내부 하위 쿼리의 별칭입니다. – peterm

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는 join 후에 처리 할 1,000,000 행으로 끝날 것입니다.