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

Есть таблица
_____________________________________
Field1 | Field2 | count | Total |
-------------------------------------------
A1 | B1 | 5 | 10 |
A1 | B2 | 5 | 10 |
A1 | B3 | 5 | 10 |
A2 | B1 | 8 | 5 |
A2 | B2 | 6 | 5 |
A2 | B3 | 8 | 5 |
------------------------------------------

Нужно в запросе выбрать первые записи по каждому значению поля A1 чтобы сумма поля count по этой группировке >= total

то есть нужно получить выборку
_____________________________________
Field1 | Field2 | count | Total |
-------------------------------------------
A1 | B1 | 5 | 10 |
A1 | B2 | 5 | 10 |
A2 | B1 | 8 | 5 |
------------------------------------------
26 июл 13, 10:03    [14620021]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Помогите чем можете
Guest
__________________________
Field1| Field2 | count | Total |
------------------------------
A1 | B1 | 5 | 10 |
A1 | B2 | 5 | 10 |
A1 | B3 | 5 | 10 |
A2 | B1 | 8 | 5 |
A2 | B2 | 6 | 5 |
A2 | B3 | 8 | 5 |
------------------------------

Нужно в запросе выбрать первые записи по каждому значению поля Field1 чтобы сумма поля count по этой группировке >= total
26 июл 13, 10:07    [14620049]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Добрый Э - Эх
Guest
Читать про накопительный итог.
Если версия сервера позволяет (2012), использовать sum() over( ORDER BY)
26 июл 13, 10:08    [14620062]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Не понял задачу... Простите. Приведите пример, что должно быть в итоге и поясните результат. Я честное слово не могу въехать..:(
26 июл 13, 10:09    [14620068]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Добрый Э - Эх
Guest
Сергей Викт.,

всё же ясно, как белый день: в разрезе групп по значениям поля Field1, в порядке сортировки по Field2 - считать накопительный итог поля count. В результат выдать лишь те строки исходного набора, в которых сумма поля COUNT не превышает значение в поле TOTAL.
26 июл 13, 10:17    [14620137]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Добрый Э - Эх
Guest
Сергей Викт.,

ну и результат же приведен ТС в первом посте, если что
26 июл 13, 10:19    [14620153]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Добрый Э - Эх,

после вашего поста про накопительный итог дотумкал, что нужно:)
26 июл 13, 10:20    [14620160]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Или я тупой или одно из двух. Можно условие подоходчивей? А то ТС, пишет одно, результат приводит другой, а Добрый Э - Эх пишет про 3-е условие.
26 июл 13, 10:27    [14620201]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
ROLpogo
Или я тупой или одно из двух. Можно условие подоходчивей? А то ТС, пишет одно, результат приводит другой, а Добрый Э - Эх пишет про 3-е условие.
Помогите чем можете
__________________________
Field1| Field2 | count | Total  |
------------------------------
A1 | B1 | 5 | 12 | A1: новая группа, 5<12 - оставляем, смотрим на остальные
A1 | B2 | 5 | 12 | A1: та же группа, 5+5<12 - оставляем, смотрим на остальные
A1 | B3 | 5 | 12 | A1: та же группа, 5+5+5>=12 - оставляем, остальные не выводить
A1 | B4 | 5 | 12 | A1: та же группа, не выводим
A2 | B1 | 8 | 5 | A2: новая группа, 8>=5 - оставляем, остальные не выводить
A2 | B2 | 6 | 5 | A2: та же группа, не выводим
A2 | B3 | 8 | 5 | A2: та же группа, не выводим
------------------------------

Нужно в запросе выбрать первые записи по каждому значению поля Field1 чтобы сумма поля count по этой группировке >= total
26 июл 13, 10:37    [14620272]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Добрый Э - Эх
Guest
Помогите чем можете,

Просто как затравочный вариант и как демонстрация того, что нужно автору...
26 июл 13, 10:39    [14620295]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Cygapb-007, тогда автор должен ждать такого решения, а не того, что он привел в первом посте:

_____________________________________
Field1 | Field2 | count | Total |
-------------------------------------------
A1 | B2 | 5 | 10 |
A2 | B1 | 8 | 5 |
26 июл 13, 10:50    [14620376]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Добрый Э - Эх
Guest
ROLpogo,

мотивировать можешь? Как сударь - с картинками?
26 июл 13, 10:53    [14620404]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
А, все, допер.
26 июл 13, 10:56    [14620432]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Добрый Э - Эх, я думал так:

автор
__________________________
Field1| Field2 | count | Total |
------------------------------
A1 | B1 | 5 | 12 | A1: новая группа, 5<12 - не выводим, смотрим на остальные
A1 | B2 | 5 | 12 | A1: та же группа, 5+5<12 - не выводим, смотрим на остальные
A1 | B3 | 5 | 12 | A1: та же группа, 5+5+5>=12 - оставляем, остальные не выводить
A1 | B4 | 5 | 12 | A1: та же группа, не выводим
A2 | B1 | 8 | 5 | A2: новая группа, 8>=5 - оставляем, остальные не выводить
A2 | B2 | 6 | 5 | A2: та же группа, не выводим
A2 | B3 | 8 | 5 | A2: та же группа, не выводим


Т.е. ищем первую запись по группе, при которой накопительная сумма по nCount станет равной или превысит Total.
26 июл 13, 11:00    [14620467]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ROLpogo
Cygapb-007, тогда автор должен ждать такого решения, а не того, что он привел в первом посте:

_____________________________________
Field1 | Field2 | count | Total |
-------------------------------------------
A1 | B2 | 5 | 10 |
A2 | B1 | 8 | 5 |
Просто надо ещё вывести ещё и все строки с меньшими накопительными суммами.
WITH T AS
(
 SELECT *
 FROM(VALUES
  ('A1', 'B1', 5, 10)
 ,('A1', 'B2', 5, 10)
 ,('A1', 'B3', 5, 10)
 ,('A2', 'B1', 8,  5)
 ,('A2', 'B2', 6,  5)
 ,('A2', 'B3', 8,  5)
 )v(Field1, Field2, cnt, total)
)
SELECT * FROM T WHERE NOT EXISTS
(
 SELECT *
 FROM T TT
 WHERE TT.Field1=T.Field1 AND TT.Field2<=T.Field2 AND (SELECT SUM(TTT.cnt) FROM T TTT WHERE TTT.Field1=TT.Field1 AND TTT.Field2<TT.Field2)>=TT.total
);
26 июл 13, 11:12    [14620567]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
iap,
да, это значительно экономнее рекурсии:)
WITH T AS ( SELECT * FROM(VALUES
  ('A1', 'B1', 5, 10),('A1', 'B2', 5, 10),('A1', 'B3', 5, 10),('A2', 'B1', 8,  5),('A2', 'B2', 6,  5),('A2', 'B3', 8,  5)
  )v(Field1, Field2, cnt, total)),
renum as(select *,row_number() over (partition by Field1 order by Field2)rn from t),
recurs as (
   select n.*, n.cnt summ
      from renum n
      where rn=1
   union all
   select n.*, n.cnt+r.summ
      from recurs r
      join renum n on n.Field1=r.Field1 and n.rn=r.rn+1
      where SIGN(n.cnt+r.summ-n.total)<=0
)
select * from recurs r
order by r.Field1, r.Field2;
26 июл 13, 11:32    [14620764]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Cygapb-007
iap,
да, это значительно экономнее рекурсии:)
Это сарказм?

Но должен заметить, что предложенный мной запрос должен очень-очень-очень тормозить!
Ничего другого про нарастающий итог коррелированными запросами я сказать не могу.
26 июл 13, 11:49    [14620950]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Я вот что подумал, а в названии темы HEAVING случайно указан? Или это требование к реализации задачи?
26 июл 13, 12:01    [14621070]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
iap
Cygapb-007
iap,
да, это значительно экономнее рекурсии:)
Это сарказм?

Но должен заметить, что предложенный мной запрос должен очень-очень-очень тормозить!
Ничего другого про нарастающий итог коррелированными запросами я сказать не могу.
отнюдь :)
двойная перенумерация, ятд, должна стоить дороже
26 июл 13, 12:03    [14621077]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
Добрый Э - Эх
Guest
Сергей Викт.
Я вот что подумал, а в названии темы HEAVING случайно указан? Или это требование к реализации задачи?
Ну, если это вдруг обязательное требование, то как вариант
26 июл 13, 12:49    [14621484]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос с having  [new]
помогите чем можете
Guest
Добрый Э - Эх,

охрене_ть, спасибо большое всем!
26 июл 13, 15:58    [14622956]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить