그룹을 수행해야하지만 조건을 만족하는 행에서만 수행해야합니다. 그렇지 않으면 조건을 충족시키지 않는 모든 행을 반환합니다. 예를 들어, 다음 표에서 "활성"필드에 '1'이있는 행만 그룹화하고 그렇지 않은 행은 모두 반환하려고합니다.중복 행을 값으로 제거
표 (ID, 라벨, 활성이) :
1, A, 1
2, A, 1
3, B, 0
4, B, 0
반환합니다 :
1, A, 1
3, B, 0
4, B, 0
그룹을 수행해야하지만 조건을 만족하는 행에서만 수행해야합니다. 그렇지 않으면 조건을 충족시키지 않는 모든 행을 반환합니다. 예를 들어, 다음 표에서 "활성"필드에 '1'이있는 행만 그룹화하고 그렇지 않은 행은 모두 반환하려고합니다.중복 행을 값으로 제거
표 (ID, 라벨, 활성이) :
1, A, 1
2, A, 1
3, B, 0
4, B, 0
반환합니다 :
1, A, 1
3, B, 0
4, B, 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
그래서 ... 활성 id = 1, 활성, 대/소문자가있는 경우 else (group)에 의해 groupit 그룹으로 변환 불행히도, 또한 반환되는 많은 다른 필드에 함수를 집계합니다. 그러나 원시 데이터를 먼저 하위 선택으로 그룹화 한 다음 기타 데이터에 조인 할 수 있다고 생각합니다. – scader
newid 자원을 많이 사용합니까? – scader
case 명령문의 고유 옵션이 몇 가지 함수 호출을 줄여주기 때문에 서브 쿼리가없고 id 필드를 다시 사용하기 때문에 필자의 메서드를 선호합니다. 그러나 이걸로 가면 GROUP BY 절에서 id 열을 제거해야한다고 생각합니다. 그렇지 않으면 그룹화되지 않은 모든 행이 반환됩니다. –
아마도 쿼리의 레이아웃은 다음과 같이 될 수 있습니다. 그룹의 사례 진술입니다. 조건이 충족되면 레이블별로 그룹화하고 그렇지 않으면 기본 키로 그룹화합니다.
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
. 지금 수정되었습니다.
꽤 모호한 질문입니다. 상당한 크기의 업데이트를 기다리는 중입니다. –
예제는 다음과 같습니다. – Amirshk