2016-12-29 1 views
0

컬럼 B 열에서 동일한 값이 모두 1과 2의 값을 가지고 있다면, 전 1 열 B의 결과를 제외 얼마나SQL 제외한 특정 결과

A B 
-- -- 
a 1 
b 1 
c 1 
d 1 
d 2 
e 1 
f 1 
f 2 
g 1 

의 데이터 세트가 있다고 가정 할 에이?

내가 내 결과이

A B 
-- -- 
a 1 
b 1 
c 1 
d 2 
e 1 
f 2 
g 1 
+1

가능성이 높습니다. –

+0

은 1,2 개의 고정 값입니까? 우리는 3을 가질 수 있습니까? – sumit

답변

0

는 값 1과 2를 위해 여기에 명시 적으로 확인하고 정확히 그 두 가지가 있다는 사실을 사용하여처럼 보이게합니다. 항상 가장 높은 가치를 원한다고 가정하는 것이 안전하다면이 점을 덜 복잡하게 만들 수 있습니다.

select 
    tbl.A, 
    tbl.B 
from 
    Table1 tbl 
    left outer join (
    select 
     A 
    from 
     Table1 
    where 
     B in (1,2) 
    group by 
     A 
    having 
     count(B) = 2 
) mlt on tbl.A = mlt.A 
where 
    (
    mlt.A is not null 
    and tbl.B = 2 
) or (
    mlt.A is null 
    and tbl.B = 1 
) 
  1. 도 아웃 값의 표를 모두 1, 2
  2. 대전 이들을 모두는 A 값.
  3. A가 하위 쿼리에 있으면 B = 2 레코드를 사용하십시오. 그렇지 않으면 B = 1 레코드를 사용하십시오.
0

예제 데이터와 원하는 결과의 경우 결과를 얻는 가장 간단한 쿼리는 GROUP BY 연산과 집계 함수가됩니다. 우리가 열 B1 또는 2이 행에만 관심이 있다면

SELECT d.A 
     , MAX(d.B) AS B 
    FROM my_data_set d 
    GROUP BY d.A 
    ORDER BY d.A 

, 우리는 출력이 동일 예제 데이터가있는 WHERE

SELECT d.A 
     , MAX(d.B) AS B 
    FROM my_data_set d 
    WHERE d.B IN (1,2) 
    GROUP BY d.A 
    ORDER BY d.A 

를 추가 할 수 있습니다.

이 두 명령문 모두 지정된 결과를 얻습니다. 동일한 예시적인 데이터에 대해, 우리는 명세서의 더 리터럴 구현 설정 동일한 결과를 반환 할 수있다 (이있다. 단지 단일A의 각 고유 값을 반환)


아니면. A 같은 값에 대해 우리가 NOT EXISTS 조건과 상관 하위 쿼리를 사용할 수 있습니다 2있는 행이있을 때

1에 행을 제외합니다. 당신은`EXISTS`을 사용

SELECT d.A 
     , d.B 
    FROM my_data_set d 
    WHERE (d.B = 2) 
    OR (d.B = 1 AND 
      NOT EXISTS (SELECT 1 
          FROM my_data_set e 
          WHERE e.A = d.A 
          AND e.B = 2 
         ) 
     ) 
    ORDER BY d.A, d.B 
+0

늘 작업 이것은 다음 세트 1 B, 1 C 1 D 1 D 2 즉 1 F, 1 F 2 g, 1 F, 3 – sumit

+0

@sumit : 대답의 시작 부분에서 말했듯이 제 제안은 질문에 주어진 "* 예제 데이터와 원하는 결과 *"에 적용 할 수있었습니다. 다른 데이터 집합이 주어지면 쿼리의 반환 값이 달라진다는 것을 지적하는 것이 옳습니다. (사실, 내 대답의 두 번째 쿼리는 사용자의 의견에 제안 된 데이터 집합에 주어진 응답에 지정된 결과를 반환합니다.) 다른 데이터 집합이 주어 졌을 때 어떤 결과가 반환되어야하는지는 모호합니다. – spencer7593

0
select 
* from tbl where a IN 
(

select 

a from tbl 
group by a 
having count(*)>1 
) 
and b!=1 

UNION ALL 

select 
* from tbl where a IN 
(

select 

a from tbl 
group by a 
having count(*)=1 
)