2016-08-24 7 views
1

В SQL как я могу исключить строку на основе значения столбца.Условные строки на основе столбца

E.g. У меня есть столбец с именем PROJECT_MGR_CODE, где значение является общим менеджером Если в результирующем наборе существует генеральный менеджер, то я хотел бы исключить директора и CE, которые находятся выше генерального менеджера.

Если генеральный директор не существует в наборе результатов, то он должен принести директор и если директор не существует, то он должен принести CE

ответ

2

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

SELECT * FROM 
(
    SELECT dt.*, 
     -- max level over all rows 
     MAX(hierarchy_level) OVER() AS max_level 
    FROM 
    ( 
     SELECT T2.*, 
     CASE 
      WHEN project_mgr_code LIKE 'CE%'    THEN 1 
      WHEN project_mgr_code LIKE 'Director%'  THEN 2 
      WHEN project_mgr_code LIKE 'General Manager%' THEN 3 
      ELSE NULL -- all other rows 
     END AS hierarchy_level 
     FROM T2 
    ) dt 
) dt 
WHERE hierarchy_level >= max_level -- best match manager 
    OR hierarchy_level IS NULL  -- all other rows 

Эта логика может быть легко расширена для добавления дополнительных уровней.

+0

thats красиво сделано! –

1

Я интересно, если это делает то, что вы хотите:

select t2.* 
from t2 
where t2.project_mgr_code like 'General Manager%' 
union all 
select t2.* 
from t2 
where t2.project_mgr_code like 'Director%' and 
     not exists (select 1 from t2 where t2.project_mgr_code like 'General Manager%'); 

Это, кажется, то, что вы описываете.

EDIT:

Для общего запроса приоритезации, используйте row_number() с информацией в order by:

select t2.* 
from (select t2.*, 
      row_number() over (order by (case when project_mgr_code like 'General Manager%' then 1 
               when project_mgr_code like 'Director%' then 2 
               when project_mgr_code like 'CE%' then 3 
              end) 
           ) as seqnum 
     from t2 
    ) t2 
where seqnum = 1; 
+0

Вышеописанное прекрасно работает, а если генеральный директор и директор не существуют в таблице, тогда CE должен быть частью результата. – user75ponic

1

Если я понял ваш вопрос правильно, это то, что вам нужно сделать:

QUERY:

SELECT * 
FROM T2 
WHERE project_mgr_code NOT LIKE 'Director%' 
     AND project_mgr_code NOT LIKE 'CE%'; 

РЕЗУЛЬТАТ:

enter image description here

Основываясь на комментарий ниже, то это то, что вам нужно:

«Если генеральный директор не существует в наборе результатов, то он должен принести директор и если директор Безразлично «т существует, то он должен принести CE»

ЗАПРОСА:

SELECT * 
FROM #T2 
WHERE project_mgr_code LIKE CASE 
          WHEN 
           (SELECT COUNT(1) 
           FROM #T2 
           WHERE project_mgr_code LIKE 'General Manager%') > 0 THEN 'General Manager%' 
          WHEN 
           (SELECT COUNT(1) 
           FROM #T2 
           WHERE project_mgr_code LIKE 'General Manager%') = 0 
           AND 
           (SELECT COUNT(1) 
            FROM #T2 
            WHERE project_mgr_code LIKE 'CE%') > 0 THEN 'CE%' 
          WHEN 
           (SELECT COUNT(1) 
           FROM #T2 
           WHERE project_mgr_code LIKE 'General Manager%') = 0 
           AND 
           (SELECT COUNT(1) 
            FROM #T2 
            WHERE project_mgr_code LIKE 'CE%') = 0 
           AND 
           (SELECT COUNT(1) 
            FROM #T2 
            WHERE project_mgr_code LIKE 'Director%') > 0 THEN 'Director%' 
         END 
     OR (project_mgr_code NOT LIKE('General Manager%') 
     AND project_mgr_code NOT LIKE('CE%') 
     AND project_mgr_code NOT LIKE('Director%') 
     ); 

РЕЗУЛЬТАТ:

enter image description here

+0

Если генеральный менеджер не существует в результирующем наборе, тогда он должен взять Директора, а если директор не существует, тогда он должен принести CE. – user75ponic

+0

@ user75ponic См. Мое новое редактирование ответа. –

+0

Обновленный SQL не возвращает ожидаемый результат, в идеале, если General Manager не существует, то директор должен отделить результат. Спасибо – user75ponic