2011-10-05 3 views
1

나는 사람과 그의 매니저가 동시에있는 사람 테이블을 가지고있다.
관리자 이메일을 선택하기 위해 SELF JOIN을 사용하고 있지만 중복 된 항목이 많습니다. 내가 MANAGER_ID으로 그룹 내 쿼리의 끝 부분에이 라인을 추가하면

http://imageshack.us/photo/my-images/3/withoutgroupby.png

어떻게 M.prs_idSELF JOIN에서 GROUP BY를 사용하는 방법은 무엇입니까?

에 의해 내 쿼리

SELECT    P.prs_id AS 'Employee_id', M.prs_id AS 'Manager_id', M.prs_email AS 'Manager_email' 
FROM    qrd_prs_person AS P 
LEFT OUTER JOIN  qrd_prs_person AS M 
ON     P.prs_manager_number = M.prs_number 

그룹으로 GROUP BY를 사용할 수 있습니다 이 오류가 나타납니다.

'qrd_prs_person.prs_id'열이 잘못되었습니다. 선택 목록은 이므로 집계 함수 또는 GROUP BY 절에 포함되어 있지 않습니다.

+0

무엇을 하려는지 명확하지 않습니다. –

+0

원하는 검색어 출력은 무엇입니까? GROUP BY는 'COUNT (M.prs_id)'와 같은 것이 있다면 작동 할 것입니다. – Arj

+0

많은 dublicate 값을받는 그룹이 없으면 Group By가 내 솔루션 원인일 경우 – wallace740

답변

3

달성하려는 목표가 확실하지 않습니까?

관리자 정보가 포함 된 두 개의 선택 열이있는 직원 당 한 행을 반환하는 쿼리를 수행 한 경우 원래 쿼리는 그룹 기준없이 올바른 것입니다. 관계는 다 대일입니다. 하나씩 (선택 사항) "하나"가있는 "많은"행부터 시작하므로 그룹화 할 필요가 없습니다.

그러나 이것은 데이터가 정확하고 prs_number가 실제로 각 직원마다 고유하다고 가정합니다. 두 명 이상의 관리자가 prs_number를 공유하는 경우 여러 명의 관리자가있는 사람들이 생깁니다.

외부 조인으로 인해 관리자가없는 사람 (즉, 먹이 사슬의 맨 위에있는 사람)도 나옵니다. 이것이 귀하의 의도입니까?

당신이 원하는 경우

편집은 관리자 만 그런 다음 첫 번째 열 (P.prs_id)를 유지하고 관리자 당 하나 개의 행을 얻을 수 없다, 돌아왔다. 하나 이상의 사용자를 관리하는 사람들의 목록을 원한다면 다음과 같은 트릭을 수행하십시오.

SELECT    M.prs_id AS 'Manager_id', M.prs_email AS 'Manager_email' 
FROM    qrd_prs_person AS P 
INNER JOIN   qrd_prs_person AS M 
ON     P.prs_manager_number = M.prs_number 
GROUP BY   M.prs_id, M.prs_email 
+0

이 사람은 비용을 들여 실제로 집계 대상을 제거합니다. 첫 번째 열. 첫 번째 열은 (prs_id) 고유하고 다른 사람들은 동일한 관리자를 가질 수 있으므로 계속 이메일을 보냈습니다 – wallace740

+0

DISTINCT를 사용하여 중복을 제거 할 수도 있습니다. –

+0

첫 번째 열은 ** P **. prs_id 였고 Person의 경우 P와 마찬가지로 관리자가 아닙니다. 모든 직속 보고서의 prs_id를 포함 시키려면 각 행에 대한 행이 필요하므로 관리자 이메일이 중복되는 원래 문제로 되돌아갑니다. –

1

왜 Min, Max, Sum 또는 그룹화가 필요한 항목이 없으므로 그룹화 하시겠습니까? order by이면 충분합니까? 어쨌든 GROUP BY 인 경우 SUM30이나 MINED가 아닌 열 은 반드시이어야하며 GROUP BY 절에 있어야합니다.

0

select 문에있는 모든 열은 그룹화해야하거나 집계 함수가 있어야합니다. MAX (qrd_prs_person.prs_id)를 추가하여 작동하는지 확인할 수 있습니다. 또한, 당신은 당신이 MySQL을 사용한다면 당신의 쿼리가

SELECT MAX(P.prs_id) AS 'Employee_id', 
     M.prs_id AS 'Manager_id', 
     M.prs_email AS 'Manager_email' 
FROM     
    qrd_prs_person AS P 
    LEFT OUTER JOIN  
     qrd_prs_person AS M ONP.prs_manager_number = M.prs_number 
GROUP BY 
    M.prs_id, M.prs_email 
+0

그래,이 쿼리가 실행되고 결과가 반환됩니다. 그러나 그룹에서 MAX P.prs_id를 선택하는 것이 무슨 의미입니까? 나는이 질문이 직접 대답되어서는 안된다고 정말로 생각한다. 더 나은 사람에게 물어보십시오 : 그의 진정한 의도는 무엇입니까? –

+0

http://imageshack.us/photo/my-images/204/withoutgroupby.png/ 나는 사람의 테이블에서 DISTINCT 이메일 주소를 받고 싶었습니다. 그러나 prs_id는 고유하고 다른 사람들은 동일한 관리자를 가질 수 있으므로 계속해서 전자 메일을 수신합니다. – wallace740

0

해야 MAX() 를 다른 파트에 의해 그룹의 이메일 ID 파트를 추가 사용해야합니다

:-) 당신이 할 수 있도록해야 그룹에서 M.prs_id 값 중 하나를 취하십시오. 그러나이 값은 그룹 내에서 다를 수 있으므로 무작위 중 하나를 선택하는 것은 의미가 없습니다. 이것이 SQL Server가 불만을 제기하는 이유입니다.

GROUP BY의 작동 방식을 오해 한 것 같습니다. 이 쿼리로 정확히 무엇을 달성하려고합니까?

0

group by을 수행 할 때 갑자기 select 절에 P.prs_id AS 'Employee_id'의 내용에 대해 가능한 많은 대답이 생기는 것이 문제입니다. (관리자의 각 직원에 대해 하나씩) SQL Sever는 사용자가 원하는 것을 정확히 알고 싶어하므로 모든 값을 하나의 값으로 합산 할 수있는 방법을 제공해야한다고 주장합니다.

아마도 직원 수를 얻고 싶으므로 COUNT(P.prs_id) AS 'Employee_count'으로 바꾸십시오.

또한 그룹 by 절에 M.prs_email을 추가해야합니다.

+0

관리자 ID (M.prs_id) 당 DISTINCT 전자 메일 주소를보고 싶습니다. – wallace740

관련 문제