2013-11-24 3 views
1

아래 코드를 실행하는 동안 다음 오류가 표시됩니다.SQL - GROUP BY 절 내에서 SELECT 문을 사용할 수 있습니까?

GROUP BY 절의 목록별로 그룹에 사용 된 식에서 집계 또는 하위 쿼리를 사용할 수 없습니다.

CREATE table #TBL 
(
    Name varchar(1028) 
) 

INSERT INTO #TBL VALUES('John') 
INSERT INTO #TBL VALUES('Jack') 

SELECT 
    CASE WHEN FirstName in (SELECT * FROM #TBL) 
      then 'A' else 'B' end, 
    COUNT(id) as Employees 
from Database 
GROUP BY CASE WHEN FirstName in (SELECT * FROM #TBL) 
      then 'A' else 'B' end 

원래 아이디어는 쿼리의 시작에서 테이블을 만드는 것이 었습니다, 그래서 대신 각 GROUP BY의 이름을 정의하는 쿼리 자체에 사용될 수있다 (#TBL SELECT * FROM).

편집 : 다른 이름으로 그룹화하고 싶습니다. 예를 들어 John이 내 목록에있는 유일한 이름 인 경우 group by 절을 GROUP BY CASE FirstName = 'John', 'A'else 'B'end로 편집 할 수 있습니다. 하지만 더 많은 이름을 추가하고 싶습니다. 매번 대신 쿼리에서 한 번 수행하려고합니다. 위의 쿼리는 쿼리에서 사용하는 많은 임시 테이블 중 하나입니다.

어떻게 할 수 있습니까? ?

감사합니다.

+0

아니, 나는 그렇게 생각하지 않는다. Group by 절 안에 select를 쓸 수 없습니다. BTW : - 왜 그렇게하고 싶어? –

+0

다른 이름으로 그룹화하고 싶습니다. 예를 들어, John이 내 목록에있는 유일한 이름 인 경우 group by 절을 편집하여 FirstName = 'John', 'A'else 'B'end로 그룹을 편집 할 수 있습니다. 하지만 더 많은 이름을 추가하고 싶습니다. 그리고 위의 쿼리는 쿼리에서 사용하는 많은 임시 테이블 중 하나 일 뿐이므로 각 시간 대신 쿼리에서 한 번 수행하려고합니다. – Shay

답변

0

당신은 alsways이 하위 쿼리 또는 공통 테이블 표현식 사용할 수 있습니다

: 당신이 #TBL 테이블에 고유 한 이름이있는 경우,

with cte as (
    select 
     id, 
     case when FirstName in (select * from #TBL) then 'A' else 'B' end as GR 
    from Database 
) 
select GR, count(id) 
from cte 
group by GR 

또는

select GR, count(id) 
from (
    select 
     id, 
     case when FirstName in (select * from #TBL) then 'A' else 'B' end as GR 
    from Database 
) as a 
group by GR 

을 또는, 당신은 단지 가입 사용할 수 있습니다

select 
    case when t.Name is not null then 'A' else 'B' end, 
    count(d.id) 
from Database as d 
    left outer join #TBL as t on t.Name = d.FirstName 
group by case when t.Name is not null then 'A' else 'B' end 

하지만 어쨌든 서브 쿼리 또는 cte를 권하고 싶습니다. 따라서 쿼리에 반복 코드가 없기 때문입니다. 표 : Database은 표의 이름이 매우 이상합니다.

+0

고마워요! Join 옵션을 사용해 보겠습니다. 하지만 하위 쿼리 또는 cte가 쿼리에서 반복되는 코드를 발생시키지 않는 이유는 무엇입니까? Join을 사용할 때마다 삽입하지 않아도됩니까? – Shay

+0

그리고 BTW, 데이터베이스는 실제로 테이블의 이름이 아니며, 예 = – Shay