Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
Здравствуйте! Есть хранимая процедура, что возвращает примерно такой набор данных:
Res_NameProjIDProjStatus
Иванов20Коммерческий
Иванов50Коммерческий
Петров20Коммерческий
Петров30Обучение
Сидоров30Обучение
Сидоров40Presale
Васин30Обучение

Надо получить такой результат:
Res_NameProjIDProjStatus
Иванов20Коммерческий
Иванов50Коммерческий
Петров20Коммерческий
СидоровNULLNULL
ВасинNULLNULL

Здесь логика такая:
- убрать все строки, у которых ProjStatus <> 'Коммерческий'
- если у фамилии вообще нет Коммерческих проектов, то оставить только одну строчку с фамилией, а ProjID и ProjStatus сделать null

Исходные данные
declare @t table (Res_Name varchar(500), ProjID int, ProjStatus varchar(50))
insert @t values ('Иванов',20,'Коммерческий'), ('Иванов',50,'Коммерческий'), ('Петров',20,'Коммерческий'), ('Петров',30,'Обучение'), ('Сидоров',30,'Обучение'),
('Сидоров',40,'Presale'), ('Васин',30,'Обучение')

select * from @t

-- Что надо получить
select * from (values ('Иванов',20,'Коммерческий'), ('Иванов',50,'Коммерческий'), ('Петров',20,'Коммерческий'), ('Сидоров',null,null), ('Васин',null,null)
)t(Res_Name, ProjID, ProjStatus)
13 июн 13, 17:52    [14430012]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
SELECT Res_Name, MAX(CASE WHEN ProjStatus = 'Коммерческий' THEN ProjStatus END)
FROM @t
GROUP BY Res_name
13 июн 13, 17:56    [14430034]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
Версия SQL
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)   Jun 28 2012 08:36:30   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: ) (Hypervisor) 
13 июн 13, 17:57    [14430037]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
select Res_Name, ProjID, ProjStatus
  from @t
 where ProjStatus = 'Коммерческий'
 union all
select distinct Res_Name, null, null
  from @t
 where Res_Name not in(select t.Res_Name from @t t where ProjStatus = 'Коммерческий')
13 июн 13, 18:03    [14430066]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
;with preSel as(
select distinct 
res_Name
from @t)
select 
p.Res_Name
,t.ProjID
,t.ProjStatus
from	preSel p
		left join @t t
		on t.Res_Name = p.Res_Name
			and t.ProjStatus = 'Коммерческий'
13 июн 13, 18:06    [14430080]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
Паганель,
спасибо, вроде оно.

Shakill,
немного неправильный результат, но идею понял, попробую в этом направлении порыть.
13 июн 13, 18:10    [14430106]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
user89, ну это примерное направление было, в конце концов все бы пришло к варианту Мистер Хенки
13 июн 13, 18:13    [14430122]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
Shakill,
ОК

Мистер Хенки,
наверное, Ваш вариант самый оптимальный. Спасибо!
13 июн 13, 18:16    [14430135]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
user89
идею понял, попробую в этом направлении порыть.
Получилось. Так, чисто для тренировки...
;with tmp as (
 select row_number() over(partition by Res_Name order by Res_Name) [rn], Res_Name,
 case when ProjStatus = 'Коммерческий' then ProjID else null end [ProjID],
 case when ProjStatus = 'Коммерческий' then ProjStatus else null end [ProjStatus]
 from @t
)
select Res_Name, ProjID, ProjStatus
from tmp
where rn = 1 or ProjStatus is not null
13 июн 13, 18:51    [14430279]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить