Оператор выбора с условием для нескольких записей

#sql #sql-server #tsql #view

#sql #sql-сервер #tsql #Вид

Вопрос:

Ниже приведена моя таблица:

введите описание изображения здесь

Я хочу создать представление со следующими условиями в операторе выбора:

Если count(employee_id)> 1, то в представлении выбирается только запись, имеющая статус = ‘Current’ .

Я пытался:

 select employee_id
    , case when COUNT(employee_id) > 1 and statusval = 'Current' then 'Y' else 'N' end as val
from table1
group by employee_id
 

Я надеюсь, что кто-нибудь сможет мне помочь с этим утверждением. Спасибо.

Комментарии:

1. Спасибо @DaleK, я пробовал несколько операторов case, но не работает.

2. Я думаю, что мой подход к рассмотрению выражения case для этого запроса был неправильным. У меня было следующее утверждение: выберите employee_id, случай, когда COUNT (employee_id)>1 и statusval = ‘Current’, затем ‘Y’, иначе ‘N’ заканчивается как значение, из группы table1 по employee_id, и я собирался включить в представление только те записи с значением val = ‘Y’.

Ответ №1:

Попробуйте это

 DECLARE @T TABLE (ID INT, STATUS VARCHAR(50))

INSERT INTO @T VALUES (1,'Current'),(2,'Historical'),(2,'Historical'),(2,'Current')

SELECT * FROM @T M
INNER JOIN (SELECT ID FROM @T
            GROUP BY ID
            HAVING COUNT(ID) > 1) S ON S.ID=M.ID
WHERE M.STATUS = 'Current'
 

Ответ №2:

Просто чтобы показать вам, как могла выглядеть ваша попытка. Вы были почти на месте, вам просто нужно было использовать оконную версию count , например

 with cte as (
    select Employee_Id, [Status]
        , case when count(*) over (partition by id) > 1 and [Status] = 'Current' then 1 else 0 end Val
    from Table1
)
select Employee_Id, [Status]
from cte
where Val = 1;
 

И этот подход, на первый взгляд, работает лучше, чем объединение.

Ответ №3:

Все ваши образцы данных имеют ровно одну строку с. 'Current' Итак, самым простым решением, по-видимому, является:

 select t.*
from t
where t.status = 'Current';