2009-03-09 2 views
10

저는 MS SQL Server로 몇 가지 작업을 포팅하려고하는 MySQL 사용자입니다.T-SQL GROUP BY : 다른 그룹화 된 열을 포함하는 가장 좋은 방법

나는 몇 개의 테이블에 가입하고 GROUP BY를 통해 일부 컬럼을 모으고있다.

select empID, fname, lname, title, dept, count(projectID) 
from employees E left join projects P on E.empID = P.projLeader 
group by empID 

... 그 MySQL의에서 작동,하지만 MS SQL은 엄격하고는 모든 것이 하나 집계 함수로 묶여 또는의 일부입니다해야합니다 :

간단한 예제는 직원과 프로젝트 것 GROUP BY 절.

물론이 간단한 예제에서는 group by 절에 여분의 열을 포함시킬 수 있다고 가정합니다. 그러나 내가 다루고있는 실제 쿼리는 꽤 복잡하고 일부 집계되지 않은 열에서 수행되는 여러 작업을 포함합니다. 즉, 그룹 by 절에 모든 개체를 포함 시키려고하면 정말 못 생깁니다. .

이렇게하려면 더 좋은 방법이 있습니까?

+0

@Dan, 내 대답에서 봐 주시기 바랍니다, 그것은 – eglasius

답변

15

:

select e.empID, fname, lname, title, dept, projectIDCount 
from 
(
    select empID, count(projectID) as projectIDCount 
    from employees E left join projects P on E.empID = P.projLeader 
    group by empID 
) idList 
inner join employees e on idList.empID = e.empID 

당신이를 피할이 방법 작업별로 추가 그룹을 만들면 원하는 데이터를 얻을 수 있습니다. 또한 일부 시나리오 (전체 정보를 반환하지 않은 경우)에서 인덱스를 잘 활용할 수있는 기회가 더 많으며 페이징과 더 잘 결합 될 수 있습니다.

+0

예, 나는 카운트가 선택에 있었다 통지를하지 않았다 같은 구문을 업데이트했다 ... 길을 따라 몇 가지 문제를 저장합니다 명부. 또한 이렇게하는 이유에 대한 정보를 추가했습니다. – eglasius

4

"group by 절에 모든 항목을 포함 시키려면 정말 못 생깁니다." * 당신이 할 수

... 그냥 복사 GROUP BY 절에 집계되지 않은 열을 붙여 별칭을 제거하고 그게수록 좋은입니다 -

그래는 - 그 그것을 할 * 할 수있는 유일한 방법입니다 중첩 된 SELECT로 감싸는 것은 아마도 추악 할 것입니다 ...

2

MySQL은 비정상적이며 기술적으로 SQL 표준을 따르지 않습니다. 따라서 GROUP BY 절에서 항목을 생략 할 수 있습니다. 표준 SQL에서 select-list의 각 집계되지 않은 열은 GROUP BY 절에 전체 목록으로 표시되어야합니다 (이름 또는 서수 순으로 표시되지만 더 이상 사용되지 않습니다).

(MySQL은 특이하지만 오, 속기를 허용 좋다.)

당신이이 선 주위에 뭔가 작업을 얻을 수
1

직원의 empID를 기준으로 그룹을 만들 필요가 없기 때문에 하위 쿼리에 조인 할 필요가 없습니다. 프로젝트의 projectLeader 필드에서 그룹화 할 수 있습니다.

내부 조인 (내가 입력 한대로)을 사용하면 적어도 하나의 프로젝트가있는 직원 목록을 얻을 수 있습니다. 모든 직원의 목록을 왼쪽으로 바꾸려면

select e.empID, e.fname, e.lname, e.title, e.dept, p.projectIDCount 
    from employees e 
    inner join (select projLeader, count(*) as projectIDCount 
        from projects 
       group by projLeader 
      ) p on p.projLeader = e.empID 
0

select 절의 하위 쿼리가 적합 할 수도 있습니다. 이 예제는 주어진 예제에서 작동하지만 실제로 다루는 복잡한 쿼리는 그렇지 않을 수도 있습니다.

select 
     e.empID, fname, lname, title, dept 
     , (select count(*) from projects p where p.projLeader = e.empId) as projectCount 
from 
    from employees E