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

Откуда:
Сообщений: 148
Допустим имеется таблица такого вида:
Batch_id Записи Число
21066 32 6
21041 33 6
21033 36 6
21037 36 6
21046 40 6
21043 37 6
21065 30 6
21055 35 6
21059 38 6
21012 30 7
21015 33 7
21001 31 7
21063 37 7
21064 31 7
21071 38 7
21077 31 7
21087 32 8
21138 30 8
21174 30 8
21124 30 8
21119 34 8
21178 31 8
21175 32 8
21023 36 8
21183 32 8
21184 31 8
21128 33 8
21182 30 8
Допустим тут где-то в сумме 500 записей, и меня просят выбрать batch_id, что бы сумма всех записей была ровна 250, и что бы в выборку попали не только TOP сколько-то записей по одному дню, а в эти 250 входили все 3 дня.

Как бы это провернуть?
8 май 14, 23:55    [15994024]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
iluxa1810,

А что не получается?
Вариантов решения много, курсор, цикл, декартово произведение с последующим поиском нужного варианта. Реализация зависит от условий задачи и объема обрабатываемых данных.
9 май 14, 00:03    [15994043]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос  [new]
iluxa1810
Member

Откуда:
Сообщений: 148
автор
Вариантов решения много, курсор, цикл, декартово произведение с последующим поиском нужного варианта. Реализация зависит от условий задачи и объема обрабатываемых данных.

А сработает реализация While в While?
Внешний дни меняет, а внутреннему посылается день и он по этому дню складывает записи и одновременно заносит batch_id в отдельную таблицу, когда нужное кол-во набрано, то день меняется и т д.
Или можно проще?
9 май 14, 12:24    [15994763]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
iluxa1810
что бы сумма всех записей была ровна 250,

Что делать, если нет записей, дающих в сумме ровно 250 ?

iluxa1810
и что бы в выборку попали не только TOP сколько-то записей по одному дню, а в эти 250 входили все 3 дня.

"Дней" всегда 3 ? Или это только в примере их 3 ?
Каждый "день" должен присутствовать в 250-ти в равной пропорции или нет ?
9 май 14, 12:38    [15994777]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Допустим тут где-то в сумме 500 записей, и меня просят выбрать batch_id, что бы сумма всех записей была ровна 250, и что бы в выборку попали не только TOP сколько-то записей по одному дню, а в эти 250 входили все 3 дня.



Вы когда настойчиво пишете "что бы" - вы искажаете смысл вашего вопроса.
9 май 14, 16:16    [15995053]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос  [new]
vadim.net
Member

Откуда:
Сообщений: 2
Используй recursive common table expression. Я copy-paste из моего MS SQL:
WITH TPSReport(Qty, PrimaryId, Level) AS 
(
	select qty, CAST(PrimaryId AS varchar(500)), 0 AS Level
	from sales
	where qty <= 250
    UNION ALL
	select tps.qty + s.qty, CAST(LTRIM(CAST(tps.PrimaryId AS varchar(500))) + ', ' + LTRIM(CAST(s.PrimaryId AS varchar(500))) AS varchar(500)), Level + 1
	from sales s
	CROSS JOIN TPSReport tps
	where tps.Qty + s.qty <= 250 and CHARINDEX(CAST(s.PrimaryId AS varchar(500)), tps.PrimaryId) = 0
	)
SELECT Qty, PrimaryId, Level from TPSReport
where Qty = 250
order by Level


твой BatchId это мой PrimaryId. Работы с днями здесь нет, но это легко добавить используя строковые или другие функции

Сообщение было отредактировано: 10 май 14, 11:00
10 май 14, 00:51    [15996490]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос  [new]
iluxa1810
Member

Откуда:
Сообщений: 148
автор
Что делать, если нет записей, дающих в сумме ровно 250 ?

Если нет, то нет. Берем сколько есть.


автор
"Дней" всегда 3 ? Или это только в примере их 3 ?

Я думаю, максимум 3, минимум 1(Ну для одного там все понятно.)

автор
Каждый "день" должен присутствовать в 250-ти в равной пропорции или нет ?

Да.
10 май 14, 12:24    [15997099]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос  [new]
vadim.net
Member

Откуда:
Сообщений: 2
Я смотрю есть еще вопросы. Я сделал таблицу с той же схемой и данными. Мой запрос теперь выглядит так:
У нас имеются повторы при CROSS JOIN. Поэтому я ввел BatchIdProd убрать их, но можно использовать что-н другое. Дла теста я взял 90.

WITH TPSReport (Record, BatchId, Number, BatchIdProd, Level) AS
(
select Record, CAST(BatchId AS varchar(500)), CAST(Number AS varchar(500)), CAST(BatchId AS bigint), 1 AS Level
from batches
where Record <= 90
UNION ALL
select tps.Record + s.Record,
CAST(LTRIM(CAST(tps.BatchId AS varchar(500))) + ', ' + LTRIM(CAST(s.BatchId AS varchar(500))) AS varchar(500)),
CAST(LTRIM(CAST(tps.Number AS varchar(500))) + ', ' + LTRIM(CAST(s.Number AS varchar(500))) AS varchar(500)),
CAST(tps.BatchIdProd * s.BatchId AS bigint),
Level + 1
from batches s
CROSS JOIN TPSReport tps
where tps.Record + s.Record <= 90
and CHARINDEX(CAST(s.BatchId AS varchar(500)), tps.BatchId) = 0 --добавляем только новые BatchId
and CHARINDEX(CAST(s.Number AS varchar(500)), tps.Number) = 0 --добавляем только новые Number

)
SELECT * FROM
(
SELECT Record, BatchId, Number, BatchIdProd, Level, ROW_NUMBER()OVER(PARTITION BY BatchIdProd ORDER BY Level) Ordering
from TPSReport
where Record = 90
) t1
where Ordering = 1
13 май 14, 00:02    [16007467]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить