#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';