Сгруппируйте записи и эту конкретную группу, если условие соответствует, затем установите конечный результат, как показано ниже

#sql #sql-server #tsql #sql-server-2012

Вопрос:

 declare @table table
(
    id int,
    status varchar(50)
)

insert into @table
    values(1,'Open'),(1,'Open'),(1,'Open'),
    (2,'Open'),(2,'Pending'),(2,'Open'),
    (3,'Open'),(3,'Completed'),(3,'Pending'),
    (4,'Pending'),(4,'Pending'),(4,'Pending'),
    (5,'Completed'),(5,'Completed'),(5,'Completed')
 

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

 --expected output
--Id    Status
--1     Open
--2     Pending
--3     Pending
--4     Pending
--5     Completed
 

Для каждой группы я хочу проверить следующее условие

 --Open
--Open => Open
--Open

--Open
--Pending => Pending
--Open

--Open
--Completed => Pending
--Open

--Pending
--Pending =>Pending
--Pending

--Completed
--Completed =>Completed
--Completed
 

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

1. Пожалуйста, объясните логику. Не очевидно, что у вас есть все условия.

2. Предполагается, что вы используете только 1 версию SQL Server, поэтому, пожалуйста, исправьте свои теги. И форматирование цитат предназначено для того, чтобы вы действительно цитировали что-то, а не только для акцента.

Ответ №1:

Вы можете использовать условную логику:

 select id,
       (case when max(status) = min(status) then max(status)
             else 'Pending'
        end) as status 
from @table t
group by id;
 

Вот скрипка db<>.

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

1. Спасибо, @Gordon Linoff Я пытался, но не мог понять, как это можно сделать

2. по крайней мере, с вашим решением у меня есть представление о том, как его можно достичь