2010-01-30 9 views
2

그룹을 수행해야하지만 조건을 만족하는 행에서만 수행해야합니다. 그렇지 않으면 조건을 충족시키지 않는 모든 행을 반환합니다. 예를 들어, 다음 표에서 "활성"필드에 '1'이있는 행만 그룹화하고 그렇지 않은 행은 모두 반환하려고합니다.중복 행을 값으로 제거

표 (ID, 라벨, 활성이) :

1, A, 1 
2, A, 1 
3, B, 0 
4, B, 0 

반환합니다 :

1, A, 1 
3, B, 0 
4, B, 0 
+0

꽤 모호한 질문입니다. 상당한 크기의 업데이트를 기다리는 중입니다. –

+0

예제는 다음과 같습니다. – Amirshk

답변

3

내가 생각할 수있는 가장 간단한 방법입니다 :

+0

대답이 너무 단순 할 때 나는 그것을 아주 좋아한다. 나는 그것에 대해 생각하지 않았다. – scader

0

당신은이에 대한 공통 값을 줄 것이다 CASE 문

select min(id) as id, label, active 
from (
    select id, label, active, 
      case 
      when active = 1 then 'active' 
      else convert(varchar,newid()) as discriminator 
      end 
    from table) t 
group by label, active, discriminator 

를 사용할 수 있습니다 조건을 만족하는 모든 행 (활성 = 1) 및 모든 다른 행의 고유 한 값으로 그룹화되지 않은 상태로 유지됩니다. .

현재 SQL 서버에 액세스 할 수 없어 완전히 테스트되지 않았습니다.

다음
select 
    min(id), 
    label, 
    max(active) 
from 
    Foo 
where 
    active = 1 
group by 
    label 

union 

select 
    id, 
    label, 
    active 
from 
    Foo 
where 
    active = 0 
+0

그래서 ... 활성 id = 1, 활성, 대/소문자가있는 경우 else (group)에 의해 groupit 그룹으로 변환 불행히도, 또한 반환되는 많은 다른 필드에 함수를 집계합니다. 그러나 원시 데이터를 먼저 하위 선택으로 그룹화 한 다음 기타 데이터에 조인 할 수 있다고 생각합니다. – scader

+0

newid 자원을 많이 사용합니까? – scader

+0

case 명령문의 고유 옵션이 몇 가지 함수 호출을 줄여주기 때문에 서브 쿼리가없고 id 필드를 다시 사용하기 때문에 필자의 메서드를 선호합니다. 그러나 이걸로 가면 GROUP BY 절에서 id 열을 제거해야한다고 생각합니다. 그렇지 않으면 그룹화되지 않은 모든 행이 반환됩니다. –

0

아마도 쿼리의 레이아웃은 다음과 같이 될 수 있습니다. 그룹의 사례 진술입니다. 조건이 충족되면 레이블별로 그룹화하고 그렇지 않으면 기본 키로 그룹화합니다.

SELECT id, label, active 
FROM table 
GROUP BY 
    CASE 
    WHEN active = 1 THEN active 
    ELSE id END, 
    label 

편집 : 나는 당신이 그룹에 원하는 필드 오해는 활성 및 레이블로 그룹화 할 경우

SELECT id, label, active 
FROM table 
GROUP BY 
    CASE 
    WHEN active = 1 THEN active 
    ELSE id END 

. 지금 수정되었습니다.