Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
Имеется таблица остатков по товару, данные в которой идут нарастающим итогом по каждой дате изменения остатка. Т. е., если товара позавчера было 2 штуки, вчера пришло еще 3 штуки, а сегодня ушло 4, то таблица будет содержать записи: позавчера - 2 вчера - 5 сегодня - 1 Вопрос - как вытащить данные из этой таблицы по последнему остатку на каждый товар (нужно учитывать, что неходовой товар лежит на складе годами и последняя дата остатка у него м. б. 1000 года ) Дополнительное условие - беспокойным юзером задается дата, на которую необходимо получить остаток (так называемая точка актуальности) и она м.б. далеко не сегодняшним днем. P.S Решил задачу в три запроса: первый выбирает остатки до указанной даты, второй группирует их по максимуму, третий вынимает значения остатков по полученным датам из второго запроса. А в меньшее количество запросов уложиться можно??? Очень хочется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 15:36 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
У меня была практически такая же задача. И сделал я ее, по сути, также как Вы, но в 1 запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 16:29 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
А пример? Пожалуйста! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 17:59 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
Я так не делал, мне эта идея не так давно пришла в голову: если хранить не только текущую дату, но и дату следующего движения по товару, то можно все выбирать одним запросом без вложенных селектов по условию, что требуемая дата между текущей и следующей. А так тут ничего особо не придумать, я только первый Ваш шаг не понял - можно же сразу группировать при условии что текущая дата до указанной. Можно сделать в один запрос с вложенным селектом(им дата считается), но при больших объемах данных это может очень тормозить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 18:26 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 20:27 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
извини, впопыхах не то ляпнул. Должно быть так: ...where A.Nomenklatura=B.Nomenklatura and A.DataOstatka=B.OstDate ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2001, 20:30 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
Приблизительно так: Пришлось выдёргивать из рабочих скриптов, так что не обессудьте ... Эдесь 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 */ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 01:29 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
А может так? 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 05:11 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
В предыдущий запрос добавить SELECT DISTINCT o.Tovar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 06:04 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
Большое спасибо, ребята. Вот только жалко, что вы чаще вечером конфу посещаете Или вы в других часовых поясах живете... У меня есть друг, судьба закинула его на Сахалин. Теперь для контакта с ним приходится постояно заниматься арифметическими упражнениями по расчету актуального для него времени. Совсем как в моей задаче К вопросу о необходимости первого запроса, выбирающего остатки меньше определенной даты. А как иначе? Ведь если мы в одном запросе будем группировать даты по максимуму с условием что дата д.б. меньше определенной, запрос выдаст нам максимальные даты, которые будут меньше определенной. Т. е. приоритет здесь меняется местами - мне же нужно сначала выбрать даты до определенной, а уж затем группировать их по максимуму Меня интересует другое - можно ли совместить второй и третий запросы. Так чтобы и группировать даты по максимуму и получать остаток, соответсвующий этой максимальной дате. Привожу свое решение, сделанное опять-таки наспех, но работающее (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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 09:40 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
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 лет ничего умнее не придумал(разве что то, что я предложил выше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 10:03 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
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 месяца назад). Поэтому мой код чаще всего далек от идеального ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 10:20 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 10:28 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
Насчет @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 и т.д. (пользуйтель алиасами - гораздо меньше писать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 10:43 |
|
||
|
Вопрос по группировке в запросе. Пожалуйста
|
|||
|---|---|---|---|
|
#18+
2 SergSuper Хорошее решение Но структуру представляемых на "свет Божий" данных, к сожалению, определяю не я. А очень хотелось бы Но в промежуточных расчетах, я безусловно, воспользуюсь Вашим предложением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2001, 10:52 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32006245&tid=1826687]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 343ms |

| 0 / 0 |
