Нужен запрос по следующему сценарию - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть результат, такой как, за которым следует

ID Name Status
1   A     Y
2   A     N
3   B     Y
4   B     Y
5   C     N

, в этом случае, если статус имени А имеет два состояния, тогда мне нужен запрос на выборку для следующего выхода

ID Name Status
1   A     N
2   A     N
3   B     Y
4   B     Y
5   C     N

И извинитеЯ не знаю, как задать вопрос по этому сценарию ..

Пожалуйста, предоставьте решение заранее

Ответы [ 6 ]

1 голос
/ 25 апреля 2019

Этот следующий скрипт выберет данные в соответствии с вашим требованием-

SELECT yt.ID, 
yt.Name, 
CASE WHEN A.N>1 THEN 'N' ELSE Status END as Status
FROM your_table yt
LEFT JOIN (
    SELECT Name,
    COUNT(DISTINCT Status) as N
    FROM your_table 
    GROUP BY Name
    HAVING COUNT(DISTINCT Status) >1
) A on yt.Name = A.Name
0 голосов
/ 25 апреля 2019

Для вашего конкретного примера вы можете просто использовать оконную функцию:

select ID, Name,
       min(Status) over (partition by name) as status
from t;

Это работает, потому что 'N' меньше 'Y', поэтому MIN() вернет 'N', если какие-либо значения 'N'.

0 голосов
/ 25 апреля 2019

Вы можете использовать оконную функцию, чтобы вам не приходилось сканировать таблицу дважды:

SELECT ID,
       [Name],
       CASE COUNT(CASE WHEN [Status] = 'N' THEN 1 END) OVER (PARTITION BY [Name]) WHEN 0 THEN [Status] ELSE 'N' END AS [Status]
FROM (VALUES(1,'A','Y'),
            (2,'A','N'),
            (3,'B','Y'),
            (4,'B','Y'),
            (5,'C','N')) V(ID, [Name], [Status]);
0 голосов
/ 25 апреля 2019

Используйте RANK в отдельном запросе, чтобы получить статус для последнего идентификатора, и оставьте соединение по имени для этого запроса, чтобы использовать последний статус для всех строк для имени

SELECT a.id, a.name, b.status
FROM dbo.Table_3 a
LEFT JOIN (SELECT id, name, status, RANK() OVER (Partition BY name ORDER BY id desc) AS rnk
           FROM dbo.table_3) b ON a.name = b.name AND b.rnk = 1
0 голосов
/ 25 апреля 2019

Использование LEFT JOIN с COALESCE в SELECT будет работать в этом случае.

Демо с примерами данных:

DECLARE @TestTable TABLE (ID INT, [Name] VARCHAR (1), [Status] VARCHAR (1));

INSERT INTO @TestTable(ID, [Name], [Status]) VALUES
(1, 'A', 'Y'),
(2, 'A', 'N'),
(3, 'B', 'Y'),
(4, 'B', 'Y'),
(5, 'C', 'N');

SELECT T.ID, 
       COALESCE(Q.[Name], T.[Name]) AS [Name], 
       COALESCE(Q.[Status], T.[Status]) AS [Status]
FROM @TestTable T
LEFT JOIN (
    SELECT DISTINCT [Name], 'N' AS [Status]
    FROM @TestTable
    WHERE [Status] = 'N'
) AS Q ON Q.[Name] = T.[Name]

Вывод:

ID  Name    Status
1   A       N
2   A       N
3   B       Y
4   B       Y
5   C       N
0 голосов
/ 25 апреля 2019

В приведенном ниже запросе derived table a извлекает отдельную запись с 'N'.Затем соединили его с основной таблицей и с помощью оператора case вытащили status.

Используя Derived Table

 select *,
    case when a.name is not null then 'N' else #temp.status end [status]
    from #temp
    Left join (select distinct name from #temp where status ='N' )a on a.name = #temp.name

Используя Case Statement

select *, 
         case (select count(*) from #temp t where status='N' and t.Name = #temp.Name)
          when 1 then 'N'
          else status 
          end   [status]
from #temp

ИЛИ

select *, 
         case when (select count(*) from #temp t where status='N' and t.Name = #temp.Name)  > 0 then 'N'
          else status 
          end   [status]
from #temp

Выход

ID  Name    Status  name    status
1   A         Y     A       N
2   A         N     A       N
3   B         Y     NULL    Y
4   B         Y     NULL    Y
5   C         N     C       N
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...