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

Откуда:
Сообщений: 2083
Есть таблица
idxflagsumma
10off25
10ctr30
20off12
20ctr14
20off5
30off10
30off11

Требуется получить
idxsumma
1055
2031

Здесь нужно оставить только ту группу idx, у которых одновременно есть и flag=off и flag=ctr
Решил таким образом. Уверен, есть варианты попроще...
declare @t table (idx int, flag char(3), summa int)
insert @t values (10,'off',25),(10,'ctr',30),(20,'off',12),(20,'ctr',14),(20,'off',5),(30,'off',10),(30,'off',11)
--select * from @t

;with a as (
  select idx, rank() over(partition by idx order by flag) [rnk]
  from @t
), b as (
  select idx, max(rnk) [rkn] from a
  group by idx
  having max(rnk) > 1
)
select t.idx, sum(t.summa) [summa]
from @t t
inner join b on t.idx = b.idx
group by t.idx
22 янв 15, 16:44    [17155542]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
забыл, SQL 2008.
Но если есть варианты для 2012, но с радостью возьму в копилку знаний.
22 янв 15, 16:44    [17155546]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
having count(distinct flag) = 2
22 янв 15, 16:46    [17155556]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
select idx, sum(summa) as summa from @t where flag IN('off','ctr')
group by idx
having COUNT(*) = 2
22 янв 15, 16:50    [17155575]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
сорри
select idx, sum(summa) as summa from @t where flag IN('off','ctr')
group by idx
having COUNT(distinct flag) = 2
22 янв 15, 16:52    [17155583]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

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

вариант с
having count(distinct flag) = 2
самый простой. Спасибо!
22 янв 15, 16:55    [17155602]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20600
Это при условии, что возможные значения для поля флагов исчерпываются двумями штуками. И что такое положение дел в принципе не может измениться в дальнейшем. Иначе придётся перелопачивать все тексты и строить костыли по типу
HAVING SUM(DISTINCT CASE flag WHEN 'off' THEN 1 WHEN 'ctr' THEN 2 ELSE 4 END) = 3
22 янв 15, 18:42    [17156198]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
user89
Member

Откуда:
Сообщений: 2083
Akina
Это при условии, что возможные значения для поля флагов исчерпываются двумями штуками. И что такое положение дел в принципе не может измениться в дальнейшем
Не изменится
Флаг off - это Offer, т.е. План. Флаг ctr - это Contract, т.е. Факт. Кроме Плана и Плана ничего не будет.

А если представить аналогичную ситуацию при увеличении флагов, то править немного
select idx, sum(summa) as summa from @t where flag in('off','ctr','f3','f4','f5')
group by idx
having count(distinct flag) = 5
22 янв 15, 18:50    [17156250]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20600
user89
А если представить аналогичную ситуацию при увеличении флагов, то править немного
select idx, sum(summa) as summa from @t where flag in('off','ctr','f3','f4','f5')
group by idx
having count(distinct flag) = 5

А вот теперь расскажи, как будешь выбирать те группы, у которых из ПЯТИ флагов есть только эти самые ДВА...
22 янв 15, 19:09    [17156352]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
Akina
user89
А если представить аналогичную ситуацию при увеличении флагов, то править немного
select idx, sum(summa) as summa from @t where flag in('off','ctr','f3','f4','f5')
group by idx
having count(distinct flag) = 5

А вот теперь расскажи, как будешь выбирать те группы, у которых из ПЯТИ флагов есть только эти самые ДВА...


declare @t table (idx int, flag char(3), summa int)
insert @t values (10,'off',25),(10,'ctr',30),(20,'off',12),(20,'ctr',14),(20,'off',5),(30,'off',10),(30,'off',11),(40,'off',10),(40,'on',20)
--select * from @t

;with flags(id,name)as
(select 1,'off' union select 2,'on' union select 4,'ctr' union select 8, 'any tag')
select idx, sum(summa) as summa 
from @t t
join flags f  on f.name = t.flag 
group by idx
having sum(distinct f.id)&5=5
22 янв 15, 19:45    [17156491]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20600
LexusR
;with flags(id,name)as
Это изменяет условия задачи.
23 янв 15, 09:02    [17157586]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
Akina
LexusR
;with flags(id,name)as
Это изменяет условия задачи.

Какой задачи? Первоначальной с 2 флагами? Так она была решена еще первым постом Glory.

А этому
--если представить аналогичную ситуацию при увеличении флагов, то править немного

select idx, sum(summa) as summa from @t where flag in('off','ctr','f3','f4','f5')
group by idx
having count(distinct flag) = 5


моё предложение по-моему не противоречит
23 янв 15, 11:49    [17158612]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить