powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по группировке в запросе. Пожалуйста
15 сообщений из 15, страница 1 из 1
Вопрос по группировке в запросе. Пожалуйста
    #32006189
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица остатков по товару, данные в которой идут нарастающим итогом по каждой дате изменения остатка. Т. е., если товара позавчера было 2 штуки, вчера пришло еще 3 штуки, а сегодня ушло 4, то таблица будет содержать записи:
позавчера - 2
вчера - 5
сегодня - 1

Вопрос - как вытащить данные из этой таблицы по последнему остатку на каждый товар (нужно учитывать, что неходовой товар лежит на складе годами и последняя дата остатка у него м. б. 1000 года )

Дополнительное условие - беспокойным юзером задается дата, на которую необходимо получить остаток (так называемая точка актуальности) и она м.б. далеко не сегодняшним днем.

P.S Решил задачу в три запроса: первый выбирает остатки до указанной даты, второй группирует их по максимуму, третий вынимает значения остатков по полученным датам из второго запроса.

А в меньшее количество запросов уложиться можно??? Очень хочется
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006196
rrr5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня была практически такая же задача.
И сделал я ее, по сути, также как Вы,
но в 1 запрос.
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006203
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А пример? Пожалуйста!
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006206
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так не делал, мне эта идея не так давно пришла в голову: если хранить не только текущую дату, но и дату следующего движения по товару, то можно все выбирать одним запросом без вложенных селектов по условию, что требуемая дата между текущей и следующей.

А так тут ничего особо не придумать, я только первый Ваш шаг не понял - можно же сразу группировать при условии что текущая дата до указанной. Можно сделать в один запрос с вложенным селектом(им дата считается), но при больших объемах данных это может очень тормозить.
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006218
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select A.Nomenklatura, A.Ostatok from Ostatki A,
(select Nomeklatura, max(DataOstatka) as OstDate from Ostatki group by Nomenklatura where DataOstatka<=@ZadanayaData) B
where A.Nomenklatura=B.Nomenklatura and A.DataOstatka=B.DataOstatka
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006219
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извини, впопыхах не то ляпнул. Должно быть так:
...where A.Nomenklatura=B.Nomenklatura and A.DataOstatka=B.OstDate
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006223
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приблизительно так:
Пришлось выдёргивать из рабочих скриптов, так что не обессудьте ... Эдесь Account - таблица счетов(товаров)Account_Id-его идентификатор (РК), Remains - остатки(Active-значение,RunDate-дата внесения), @RunD - дата отчёта. Индекс в Remains по Account_Id,RunDate.
1-й для SQL 6.5
SELECT a.Account_Id, r.Active, u.Name, a.Account_Name FROM Account a, Remains r
WHERE r.Account_Id = a.Account_Id AND
r.RunDate = (SELECT MAX(r_1.RunDate) FROM Remains r_1 WHERE r_1.Account_id = r.Account_id AND r_1.RunDate <= @RunD)
/* на Ваше усмотрение
a.Schet LIKE @Criteria
ORDER BY a.Account_No */
Для 7.0 и 2000
SELECT a.Account_Id,
(SELECT TOP 1 r.Active FROM Remains r WHERE r.Account_id = a.Account_id
AND r.RunDate <= @RunD ORDER BY r.RunDate DESC), a.Schet, a.Account_Name
FROM Account a
/* Аналогично
WHERE
a.Schet LIKE '60312810_0101%'
ORDER BY a.Account_No */
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006229
Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может так?

select o.Tovar, (select Ostatok FROM Ostatki o1
WHERE o1.Tovar=o.Tovar and o1.DateOst=
(SELECT max(o2.DateOst) FROM Ostatki o2 WHERE o2.Tovar=o.Tovar and o2.DateOst<=@DT)
from Ostatki o
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006234
Epanch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В предыдущий запрос добавить
SELECT DISTINCT o.Tovar
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006240
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо, ребята. Вот только жалко, что вы чаще вечером конфу посещаете Или вы в других часовых поясах живете... У меня есть друг, судьба закинула его на Сахалин. Теперь для контакта с ним приходится постояно заниматься арифметическими упражнениями по расчету актуального для него времени. Совсем как в моей задаче
К вопросу о необходимости первого запроса, выбирающего остатки меньше определенной даты. А как иначе? Ведь если мы в одном запросе будем группировать даты по максимуму с условием что дата д.б. меньше определенной, запрос выдаст нам максимальные даты, которые будут меньше определенной. Т. е. приоритет здесь меняется местами - мне же нужно сначала выбрать даты до определенной, а уж затем группировать их по максимуму
Меня интересует другое - можно ли совместить второй и третий запросы. Так чтобы и группировать даты по максимуму и получать остаток, соответсвующий этой максимальной дате.
Привожу свое решение, сделанное опять-таки наспех, но работающее (detail-таблица ТМЦ, ostatok - таблица остатков, rezerv - резервы, price_records - прайсы) Кстати, если кто предложит более короткий вариант, например, без временных таблиц, и этот вариант будет работать быстрее, с удовольствием заменю им свою SP:

CREATE PROCEDURE SEL_OST_TATOK (@price_s varchar(40), @date_2 smalldatetime, @base_s smallint, @sel_s varchar(40)) AS

--Процедура расчета остатков на конечную дату в форме промотра остатков

BEGIN

--Временная таблица для остатка, который не имел движения и поэтому д.б. последний остаток
create table #ost (base_id smallint, detail_id int null, date smalldatetime)
insert into #ost
SELECT base_id, detail_id, date FROM ostatok
WHERE date<=@date_2 and base_id = @base_s

--Выборка последней даты остатка для актуализации
create table #ostatok_dat (base_id smallint, detail_id int null, Max_dat smalldatetime)
insert into #ostatok_dat
select base_id, detail_id, MAX(date) AS Max_dat
FROM #ost GROUP BY base_id, detail_id

--Выборка самих остатков по полученным данным
create table #ost_t (base_id smallint, date smalldatetime, detail_id int, ostatok int, price_uchet float)
insert into #ost_t
SELECT ostatok.BASE_ID, #ostatok_dat.Max_dat, ostatok.detail_id, ostatok.ostatok, ostatok.price_uchet
FROM ostatok RIGHT OUTER JOIN #ostatok_dat ON ostatok.base_id = #ostatok_dat.base_id AND ostatok.detail_id = #ostatok_dat.detail_id AND ostatok.date = #ostatok_dat.Max_dat

--Расчет и выборка полной информации по остаткам
select d.detail_id, d.detail_name, d.detail_kod, o.ostatok as ost_2, o.price_uchet,
p_r.price, sum(v_r.sum_qwont) as s_qwon, max(o.date) as date
from detail d, #ost_t o, v_rezerv v_r, price_records p_r
where p_r.price_id=@price_s
--and d.base_id=@base_s and o.base_id=@base_s and v_r.base_id=@base_s
and d.detail_id*=o.detail_id and d.detail_id*=v_r.detail_id and d.detail_id*=p_r.detail_id
group by d.detail_id, d.detail_name, d.detail_kod, o.ostatok, o.price_uchet, p_r.price
order by d.detail_name

end
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006242
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AlexUnik

Может я чего-то не понимаю, но что измениться, если первых 2 выражения заменю одним?

create table #ostatok_dat (base_id smallint, detail_id int null, Max_dat smalldatetime)
insert into #ostatok_dat
select base_id, detail_id, MAX(date) AS Max_dat
FROM ostatok GROUP BY base_id, detail_id
WHERE date<=@date_2 and base_id = @base_s

(кстати зачем base_id если он всё равно равен @base_s?)

В остальном я делаю примерно тоже самое и за 5 лет ничего умнее не придумал(разве что то, что я предложил выше)
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006245
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper
Base_s - для различия предприятий в общем журнале операций. Он передается в качестве параметра в SP. Если Вы не против, принимаю Ваш вариант:

create table #ostatok_dat (base_id smallint, detail_id int null, Max_dat smalldatetime)
insert into #ostatok_dat
select base_id, detail_id, MAX(date) AS Max_dat
FROM ostatok GROUP BY base_id, detail_id
WHERE date<=@date_2 and base_id = @base_s

Наверное, сказывается практика работы под Access (на SQL Server перешел 2 месяца назад).
Поэтому мой код чаще всего далек от идеального
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006247
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper
SQL нас поправил насчет очередности GROUP и WHERE
--Временная таблица для остатка, который не имел движения и поэтому д. б. просто последний остаток
create table #ostatok_dat (base_id smallint, detail_id int null, Max_dat smalldatetime)
insert into #ostatok_dat
select base_id, detail_id, date, MAX(date) AS Max_dat
FROM ostatok
where ostatok.base_id=@base_s and ostatok.date<@date_2
GROUP BY base_id, detail_id
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006250
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет @base_s и base_id

Не принципиально, но я бы выкинул это дело из таблиц

create table #ostatok_dat (detail_id int null, Max_dat smalldatetime)
insert into #ostatok_dat
select detail_id, MAX(date) AS Max_dat
FROM ostatok
WHERE date<=@date_2 and base_id = @base_s
GROUP BY detail_id

create table #ost_t ( date smalldatetime, detail_id int, ostatok int, price_uchet float)
insert into #ost_t
SELECT t.Max_dat, o.detail_id, o.ostatok, o.price_uchet
FROM ostatok o RIGHT OUTER JOIN #ostatok_dat t ON o.base_id = @base_s AND o.detail_id = t.detail_id AND o.date = t.Max_dat
и т.д.
(пользуйтель алиасами - гораздо меньше писать)
...
Рейтинг: 0 / 0
Вопрос по группировке в запросе. Пожалуйста
    #32006251
AlexUnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper
Хорошее решение Но структуру представляемых на "свет Божий" данных, к сожалению, определяю не я. А очень хотелось бы Но в промежуточных расчетах, я безусловно, воспользуюсь Вашим предложением.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по группировке в запросе. Пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]