2014-07-21 7 views
1

의 내가 같은 몇 가지 정보를 가지고 있다고 가정 해 봅시다 다음SQL 조건부 논리

First_Name Last_Name Title   Branch Location 
John  Johnson Manager   NY 
Jack  Smith  Internet Manager NY 
Chris  Jones  Internet Manager NY 
Harold  O'Reilly Executive  NY 
Liz  Young  Manager   WA 
Trey  Ritter Manager   WA 
Rick  Morgan Executive  NC 
Allison Hubbard Internet Manager NC 
Holly  Dietz  Executive  FL 

나는 다음과 같은 논리를 적용하려면 :

  • 위치에서 인터넷 관리자 존재가 다른 존재하는 경우 레코드 (임원 관리자)를 제거 할 수 있습니다. 해당 인터넷 관리자가 둘 이상인 경우 해당 레코드를 보존하십시오. 위치에서 적어도 하나의 매니저이 존재하는 경우에는 인터넷 관리자에게

    • 이없는 경우

    • , 그 기록을 보존하고 간부 레코드를 제거합니다.

    • 관리자 레코드가 없으면 exec 레코드를 보관하십시오. 나는 아마 그 효과에 조건이나 어떤 존재 사용해야 할 것입니다 알고

      First_Name Last_Name Title   Branch Location 
      Jack  Smith  Internet Manager NY 
      Chris  Jones  Internet Manager NY 
      Liz  Young  Manager   WA 
      Trey  Ritter Manager   WA 
      Allison Hubbard Internet Manager NC 
      Holly  Dietz  Executive  FL 
      

      ,하지만 난 여기서 확실 해요 :

그래서, 본질적으로 같은 결과를 보일 것 시작한다. 필요한 출력을 얻으려면 어떻게해야합니까?

+0

인터넷 관리자가 두 명 이상인 경우 임원과 인터넷 관리자가 필요하지만 관리자는 필요하지 않습니까? 그 맞습니까? – Jenn

+0

@ Jenn No - 적어도 한 명의 인터넷 관리자가있는 경우 해당 레코드 (원하는 인터넷 관리자 수)를 원합니다. 임원과 관리자는 삭제할 수 있습니다. 희망을 조금 분명히. – Ryan

+0

결과 세트에서 Harold O'Reilly를 제거 할 수 있습니까? – Jenn

답변

2

내가 다음 단계로이 문제를보고 싶은데 :

  1. 하는 각 지점
에 사용할 수있는 가장 높은 우선 순위와 일치하는 모든 이름을 찾아 각 지점
  • 에 대한 가장 높은 우선 순위 제목 찾기

    따라서 1 단계부터 :

    select Branch_Location, 
        [titleFlag] = min(case 
             when Title='Internet Manager' then 1 
             when Title='Manager' then 2 
             when Title='Executive' then 3 
             else 999 
            end) 
    from table 
    group by Branch_location 
    

    그런 다음 1 단계를 su A의 bquery 가입 (나는 그것을 분리하는 CTE 문을 사용합니다) : 당신이 볼 수 있듯이, 정말 제대로 주문할 수하는 if 문, 오히려 case 문을 사용하지 않는

    ;with bestTitle as (
        select Branch_Location, 
        [titleFlag] = min(case 
             when Title='Internet Manager' then 1 
             when Title='Manager' then 2 
             when Title='Executive' then 3 
             else 999 
             end) 
        from table 
        group by Branch_location 
    ) 
    select n.* 
    from table n 
        join bestTitle t on n.Branch_Location=t.Branch_Location 
            and n.Title = case t.titleFlag 
                when 1 then 'Internet Manager' 
                when 2 then 'Manager' 
                when 3 then 'Executive' 
                else 'This is an unknown condition...' 
               end 
    

    제목 우선 순위 지정. 거기에서 1 단계 하위 쿼리는 각 분기에 대해 찾을 항목을 결정하고 2 단계 외부 쿼리는 해당 조건을 충족하는 레코드를 찾습니다.

  • +0

    고마워요! 이 사고 방식은 정확하게 제가 찾고 있던 것입니다. 설명에 감사 드리며 매우 도움이됩니다. – Ryan

    +0

    @ 라이언, 도움이 되었기 때문에 기쁩니다. 또한이 문제를 해결할 수있는 여러 가지 방법이 있으며 테이블 및 기타 세부 사항의 정확한 구조에 따라 다른 것보다 더 나은 점도 유의해야합니다. – chezy525