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

Откуда:
Сообщений: 2083
Есть таблица
idxProjName
1NULL
2a
3a
4a
5b
6

Надо получить
idxProjNamecnt
1NULL0
2a1
3a0
4a0
5b1
60

Здесь если ProjName = null или пустая строка, то счетчик cnt = 0. Если ProjName повторяется 1 раз, то cnt = 1.
Если ProjName повторяется несколько раз, то напротив любого ProjName ставим = 1, а у других = 0.

Моя неудачная попытка
declare @t table (idx int identity, ProjName varchar(max))
insert @t select null union all select 'a' union all select 'a' union all select 'a' union all select 'b' union all select ''
 
select *, max(case when isnull(ProjName,'')<>'' then 1 else 0 end) over(partition by ProjName) [cnt]
from @t
order by idx

SQL 2008
19 авг 14, 17:56    [16464277]     Ответить | Цитировать Сообщить модератору
 Re: Запрос.  [new]
user89
Member

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

решил...
select *,
case when min(case when isnull(ProjName,'')<>'' then 1 else 0 end) over(partition by ProjName) = 1 and min(idx) over(partition by ProjName) = idx then 1 else 0 end
from @t
order by idx
19 авг 14, 18:01    [16464306]     Ответить | Цитировать Сообщить модератору
 Re: Запрос.  [new]
user89
Member

Откуда:
Сообщений: 2083
хотелось бы еще увидеть решение для SQL 2012. Так, на будущее...
20 авг 14, 13:38    [16468023]     Ответить | Цитировать Сообщить модератору
 Re: Запрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
user89
user89,

решил...
select *,
case when min(case when isnull(ProjName,'')<>'' then 1 else 0 end) over(partition by ProjName) = 1 and min(idx) over(partition by ProjName) = idx then 1 else 0 end
from @t
order by idx
А если с 7 по 10 опять a пойдут подряд?
20 авг 14, 13:44    [16468081]     Ответить | Цитировать Сообщить модератору
 Re: Запрос.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Берёшь три копии таблицы.
Cвязываешь t1 left join t1 left join t3 on t1.idx=t2.idx+1=t3.idx-1.
Если t1.ProjName=t2.ProjName<>t3.ProjName, то 1, иначе 0.
20 авг 14, 14:11    [16468328]     Ответить | Цитировать Сообщить модератору
 Re: Запрос.  [new]
user89
Member

Откуда:
Сообщений: 2083
iap
А если с 7 по 10 опять a пойдут подряд?
Сейчас проверил, всё верно посчиталось. Должен быть только один Yes
declare @t table (idx int identity, ProjName varchar(max))
insert @t select null union all select 'a' union all select 'a' union all select 'a' union all select 'b' union all select ''
union all select 'a' union all select 'a' union all select 'a' union all select 'a'
 
select *,
case when min(case when isnull(ProjName,'')<>'' then 1 else 0 end) over(partition by ProjName) = 1
and min(idx) over(partition by ProjName) = idx then 'Yes' else 'No' end [Transfer Staff Cost from MS Project]
from @t
order by idx
20 авг 14, 15:28    [16468877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить