Помогите решить задачку, не первый раз встречается

1. BALGAR 05.03.24 19:31 Сейчас в теме
Помогите решить задачку, не первый раз встречается, хотелось бы разобраться.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user856012 13 05.03.24 19:53 Сейчас в теме
(1)
Помогите решить задачку, не первый раз встречается, хотелось бы разобраться.
А будет ветка "Помогите потратить зарплату, не первый раз выплачивается, хотелось бы поделиться"?
3. BALGAR 05.03.24 20:03 Сейчас в теме
(2)Я пытаюсь разобраться в задаче, можно ли ее решить с помощью одного запроса или же без написания алгоритма не обойтись. Спасибо за ваш комментарий, жалко он не помогает мне приблизится к понимаю решения.
5. Said-We 06.03.24 00:48 Сейчас в теме
(3) Можно.
Не сильно думал - набросал. Может какие случаи и упустил, но дописать можно. Что-то лень сегодня думать :-) Да и не большой я специалист в SQL.
Вариантов решения наверняка много и 100% есть на порядок проще, чем я набросал. Но для нужного Вам ответа можно или нельзя нарисовать запросом - достаточно. У вас же спортивный интерес.
Входные данные чуть изменил. Если даты плана нет, то кидается на дату не существующую в планах 31.12.2999.
Если факта нет, то строку оставляю, но можно убрать в конце условие после or - тогда не будет.

https://onecompiler.com/sqlite/426dx88ce
WITH vt_plan as
(SEL ECT 1 as tov, 1 as doc, DATETIME('2023-01-15T00:00:00.000') as DateX, 10 kol
UNI ON ALL SEL ECT 1, 1, DATETIME('2023-01-30T00:00:00.000'), 15
UNI ON ALL SEL ECT 2, 1, DATETIME('2023-01-30T00:00:00.000'), 8
UNI ON ALL SEL ECT 2, 2, DATETIME('2023-02-08T00:00:00.000'), 14
UNI ON ALL SEL ECT 5, 5, DATETIME('2023-02-08T00:00:00.000'), 12
)
,vt_fakt as
(SEL ECT 1 as tov, 1 as doc, DATETIME('2023-01-16T00:00:00.000') as DateX, 4 kol
UNI ON ALL SEL ECT 1, 1, DATETIME('2023-01-20T00:00:00.000'), 7
UNI ON ALL SEL ECT 1, 1, DATETIME('2023-01-22T00:00:00.000'), 2
UNI ON ALL SELECT 1, 1, DATETIME('2023-01-25T00:00:00.000'), 10
UNI ON ALL SELECT 1, 1, DATETIME('2023-01-30T00:00:00.000'), 2
UNI ON ALL SELECT 2, 1, DATETIME('2023-01-30T00:00:00.000'), 5
UNI ON ALL SELECT 2, 2, DATETIME('2023-02-10T00:00:00.000'), 15
UNI ON ALL SEL ECT 2, 2, DATETIME('2023-02-11T00:00:00.000'), 3
UNION ALL SEL ECT 3, 3, DATETIME('2023-02-10T00:00:00.000'), 11
)
,vt_1 as
(SEL ECT DISTINCT t.* FR OM
	(SEL ECT t.tov, t.doc FR OM vt_plan as t
	UNION ALL SEL ECT t.tov, t.doc FR OM vt_fakt as t) as t
)

SEL ECT
	 t.tov, t.doc, t.Date_Plan, t.kol_Plan, t.Date_Fakt
	,ifNULL(t.kol, 0)
FR OM
	(SEL ECT
		 t.tov, t.doc, t.Date_Plan, t.kol_Plan, t.Date_Fakt
		,case when t.delta<=t.kol_Plan or t.kol_Plan=0
		    then
		      case when t.delta<t.kol_Fakt
		        then t.delta
		        else t.kol_Fakt
		      end
		  else t.kol_Fakt - t.delta + t.kol_Plan
		end as kol
	FR OM
		(SEL ECT
			 t1.tov, t1.doc, t1.DateX as Date_Plan, t1.kol as kol_Plan, t1.kol_Plan_ni, t2.DateX as Date_Fakt, t2.kol as kol_Fakt
			,t1.kol_Plan_ni + sum(t2.kol) over(PARTITION by t1.tov, t1.doc, t1.DateX ORDER by t2.DateX) as delta
		fr om (SEL ECT
				 t.*
				,t.kol - sum(t.kol) over(PARTITION by t.tov, t.doc ORDER by t.DateX) as kol_Plan_ni
				FR OM (sel ect t.tov, t.doc, t.DateX, t.kol fr om vt_plan as t
					 UNION all sel ect t.tov, t.doc, DATETIME('2999-12-31T00:00:00.000'), 0 fr om vt_1 as t
					) as t
			) as t1
		LEFT JOIN vt_fakt as t2 on t1.tov=t2.tov and t1.doc = t2.doc
		) as t
	) as t
WH ERE t.kol>0 or (t.kol is null and t.kol_Plan<>0)
ORDER by t.tov, t.doc, t.Date_Plan, t.Date_Fakt
Показать


Или тут как на 1С решить подобную задачу с кучей обсуждения...
https://infostart.ru/1c/articles/68225/
Но это не совсем Ваш случай - у Вас даты имеют совсем другой смысл. И факт может быть и раньше плана. :-)
Прикрепленные файлы:
7. Fox-trot 158 06.03.24 09:04 Сейчас в теме
8. nomad_irk 76 06.03.24 09:43 Сейчас в теме
(3)
можно ли ее решить с помощью одного запроса или же без написания алгоритма не обойтись

Можно, но текст запроса будет страниц так на 5(в лучшем случае), да и не факт, что будет быстрее, чем выполнить постобработку.
12. Said-We 06.03.24 16:01 Сейчас в теме
(8)
Можно, но текст запроса будет страниц так на 5(в лучшем случае), да и не факт, что будет быстрее, чем выполнить постобработку.
Судя по вопросу и уточнениям автора - спортивный интерес. В 1С да будет километровый текст запроса, который выполняется не быстро, так как нарастающий итог в 1С считать это джоин таблицы сама с собой и сворачивать. А это боль и слёзы. :-)
В общем случае на SQL запрос не сложный и выполняется достаточно быстро.
4. Said-We 05.03.24 22:11 Сейчас в теме
(1) В задании, которое тебе дали есть минимум одна "подлянка". По (товару 2, заказу 2) план 14 меньше факта 15. Куда лишний факт девать? К несуществующей плановой дате отгрузки?
6. ElGatoGris 06.03.24 05:38 Сейчас в теме
Строго говоря, в такой постановке задача не решается .
Например, Товар1 по Заказу1 запланирован к отгрузке двумя партиями. В условии не задано никаких критериев сопоставления фактической отгрузки с партией, и соответственно планируемой датой отгрузки. Можно, конечно, самостоятельно что-то придумать, но это уже относится с уточнению задачи, а не к её решению.
11. Said-We 06.03.24 13:45 Сейчас в теме
(6)
Строго говоря, в такой постановке задача не решается .
Например, Товар1 по Заказу1 запланирован к отгрузке двумя партиями. В условии не задано никаких критериев сопоставления фактической отгрузки с партией, и соответственно планируемой датой отгрузки. Можно, конечно, самостоятельно что-то придумать, но это уже относится с уточнению задачи, а не к её решению.
С датами и несколькими отгрузками по одной плановой отгрузке и наоборот по нескольким плановым датам одной отгрузкой и вперемешку как раз решается.
Не оговорено тут превышение количества отгрузок над планом. И полное отсутствие отгрузок, если есть план. Но после уточнения делается за 10 секунд. В целом задача имеет какое-то решение.
9. BALGAR 06.03.24 10:04 Сейчас в теме
Ну мое виденье решение задачи. Взять таблицу "Фактическая отгрузка" и сравнивать ее с таблицей "Плановые сроки отгрузки" на наличие ближайшей плановой даты отгрузки (как слева так и справа). Если такая дата найдена в таблице "Плановые сроки отгрузки", то из поля "Количество" плановое вычитать поле "Количество" фактическое. Если поле "Количество" плановое больше ноля. то брать следующую запись и таблицы "Фактическая отгрузка" и списывать то количество которое осталось.
10. Said-We 06.03.24 10:23 Сейчас в теме
(9) Вы даже можете всё это попробовать по первой ссылке в {5}. Это онлайн "компилятор". Входные данные меняйте и смотрите результат. А по второй ссылке прочитать теорию и обсуждения, как подобное реализовывается в 1С. :-)
А если воспользоваться Яндексом, и поискать списание по FIFO одним запросом, то можно найти ещё 10-ок ссылок с другими вариантами решения. :-)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот