Эффективный способ поставить условие case, чтобы найти правильное значение в SQL Server из нескольких строк в таблице базы данных - PullRequest
0 голосов
/ 28 апреля 2020

Мне нужна небольшая помощь, чтобы просто данные, которые имеют несколько различных строк с различными значениями.

Мне нужно применить условие CASE, основанное на различных значениях, чтобы извлечь правильный отдельный набор данных строка.

Пример таблицы имен ядра: Employee

ID EmployeeCode DEPT_Code
--------------------------
1  123          X
1  123          X1
1  123          X2

Вкл. DEPT_code Я хочу применить условие CASE для вывода в одну строку

  • , если хотя бы один из кратных Dept_code имеет «X», затем value = 'ABC'
  • , если для кратного Dept_code есть «X1» и «X2», тогда value = 'ABC'
  • , если для кратного Dept_code просто Только X1 ', затем value = 'xyz'
  • , если кратное число Dept_code имеет только' X2 ', то value = 'opq'

Выход будет в одной строке.

 ID   EmployeeCode   Dept_Code
 ----------------------------------------------------
 1     123           (Value based on a CASE expression)

Ответы [ 2 ]

1 голос
/ 28 апреля 2020
select ID, EmployeeCode,
    case
        when max(Dept_Code) = 'x2' then 3
        when max(Dept_Code) = 'x1' and count(*) = 1 then 2
        when max(Dept_Code) = 'x1' and min(Dept_Code) = 'x' then 1
        else 0
    end
from employee
group by ID, EmployeeCode

Существуют различные варианты, которые дают одинаковые результаты. Поскольку вы не объяснили, что означают различные комбинации, вы должны решить, как настроить логи c в соответствии с вашими данными.

1 голос
/ 28 апреля 2020

Я бы сделал это так:

не проверено

select e.ID, e.EmployeeCode
   -- each of C1, C2, C3 DEPT_Code will be null if the condition is not met.
   -- nested isnull statements select whichever condition is met first.
   ,isnull(max(C1.DEPT_Code), isnull(max(C2.DEPT_Code), isnull(max(C3.DEPT_Code), 'unknown'))) DEPT_Code
from Employee e
left outer join (  -- IDs that match your first or second condition, which are the same.
   select e1.ID, 'ABC' Dept_Code
   from Employee e1
   where DEPT_Code = 'X'
   group by e1.ID
) C1 on C1.ID = e.ID
left outer join ( -- IDs that match your third condition
   select e2.ID, 'xyz' Dept_Code
   from Employee e2
   group by e2.ID
   having min(e2.Dept_Code) = 'X1'
      and max(e2.Dept_Code) = 'X1'
) C2 on C2.ID = e.ID
left outer join ( -- IDs that match your fourth condition
   select e3.ID, 'opq' Dept_Code
   from Employee e3
   group by e3.ID
   having min(e3.Dept_Code) = 'X2'
      and max(e3.Dept_Code) = 'X2'
) C3 on C3.ID = e.ID
group by e.ID, e.EmployeeCode
order by e.ID
...