:: Игры Разума
Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
Решил создать отдельную тему, так как этот вопрос для собеседования, пожалуй, некорректен - сложноват.

Задание: одним селектом сделать связь типа многие-ко-многим между двумя таблицами типа приход и расход, для простоты без учета кода товара, склада и т.п., по методу FIFO (первый приход первым расходуется). Считаем что таблицы прихода и расхода уже отсортированы в правильном порядке (по id).

Дано (данные произвольные):

create table #Incoming (id int, amount int)
create table #Outcoming (id int, amount int)
insert #Incoming values (1, 10)
insert #Incoming values (2, 20)
insert #Incoming values (3, 24)
insert #Incoming values (4, 40)
insert #Outcoming values (1, 5)
insert #Outcoming values (2, 7)
insert #Outcoming values (3, 3)
insert #Outcoming values (4, 16)
insert #Outcoming values (5, 4)
insert #Outcoming values (6, 13)
insert #Outcoming values (7, 31)

Требуется получить таблицу связей вида
create table #in_out (id_in int, id_out int, amount int)
id_in id_out amount
1 1 5
1 2 5
2 2 2
2 3 3
...
Удачи.



Исправлено 1 раз(а). Последнее : AleksM, 01.03.07 11:47
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Если честно, то ничего не понял на счет выходной таблицы


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Я тоже
тем более не понятно
id_in	id_out	amount  
  1	1	5  
  1	2	5

Эта циферка как считается ?


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Ага. И почему, например нет такого

id_in id_out amount
1 3 5


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
Таблица связей реализует схему связи многие-ко-многим между таблицами прихода и расхода:

id_in - внешний ключ, ссылка на идентификатор записи в таблице прихода;
id_out - внешний ключ, ссылка на идентификатор записи в таблице расхода;
amount - количество товара, списываемого по записи расхода из записи прихода

(странно, я думал все сталкивались с подобными задачами)
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
id_in id_out amount
1 1 5
1 2 5
2 2 2
2 3 3
...

Поясняю как считается эта таблица.

Берем первую строку расхода: по ней списывается 5 единиц, сравниваем со строками прихода, видим что по первой строке прихода есть в остатке 10 единиц, получается что по первой строке расхода можем все 5 единиц взять из первой же строки прихода, таким образом формируется связь (id_in=1, id_out=1, amount=5), и в остатке первой строки прихода остается 5 единиц (10-5).

Берем вторую строку расхода (7 единиц), сравниваем с остатками по строкам прихода, ... в результате формируем две строки связи: (id_in=1, id_out=2, amount=5) и (id_in=2, id_out=2, amount=2) (5+2=7). В результате по первой строке прихода остатка нет, по второй остаток уменьшился на 2 единицы (20-2=18).

И так далее.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Цитата:
amount - количество товара, списываемого по записи расхода из записи прихода
Туман усилился, видимость 0 (это я про свою голову)


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Ну и что в решении интересного

create cursor Incoming (id int, amount int)
create cursor Outcoming (id int, amount int)
insert INTO Incoming values (1, 10)
insert INTO Incoming values (2, 20)
insert INTO Incoming values (3, 24)
insert INTO Incoming values (4, 40)
insert INTO Outcoming values (1, 5)
insert INTO Outcoming values (2, 7)
insert INTO Outcoming values (3, 3)
insert INTO Outcoming values (4, 16)
insert INTO Outcoming values (5, 4)
insert INTO Outcoming values (6, 13)
insert INTO Outcoming values (7, 31)
SELECT mat.id as 'Товар', ;
Incoming.amount as 'Приход', ;
Outcoming.amount as 'Расход' FROM ;
(SELECT id FROM InComing ;
UNION ;
SELECT id FROM OutComing ;
) mat ;
LEFT JOIN Incoming ON mat.id = Incoming.id ;
LEFT JOIN Outcoming ON mat.id = Outcoming.id


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
SELECT mat.id as 'Товар', ;
Incoming.amount as 'Приход', ;
Outcoming.amount as 'Расход'
Нет, это не то что требуется. Про коды товаров речь не идет (пока) вообще. Считаем что у нас один вид товаров (для простоты).



Исправлено 1 раз(а). Последнее : Prudivus, 01.03.07 12:35
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Внутренний голос мне подсказывает, что это не то
Попробую сформулировать задачу:
Нужно сформировать выходную таблицу, в которой было бы видно, какое количество и из какого прихода можно взять для каждого расхода (по FIFO).


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.




Исправлено 2 раз(а). Последнее : AleksM, 01.03.07 12:37
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Ага, те вся твоя постановка задачи - это только для одного товара, причем по этому товару есть 4-е прихода и 7 расходов, пралЬна?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Если ещё проще, то иметь полную оборотку

ост на начало - приход - расход - ост на конец.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
Цитата:
Нужно сформировать выходную таблицу, в которой было бы видно, какое количество и из какого прихода можно взять для каждого расхода.
Совершенно верно.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
Цитата:
Если ещё проще, то иметь полную оборотку
ост на начало - приход - расход - ост на конец.
Да нет, обороток пока не надо, просто таблицу связей.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
То есть задачка то итеративная, а решить нужно одним запросом декларативного языка. И еще внутри запроса понятий первый/последний/следущий/предыдущий вроде как в принципе нет.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
Цитата:
внутри запроса понятий первый/последний/следущий/предыдущий вроде как в принципе нет
order by

Решить это все одним запросом можно. Для начала можно разбить на последовательные запросы с записью промежуточных результатов, на больших объемах это дает определенный выигрыш.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Ну изобрази ?


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Это конечно не один селект, но у меня тут только шестерка, а на девятке это элементарно запихивается в один
create table input (id int, amount int)
create table output (id int, amount int)
insert into input values (1, 10)
insert into input values (2, 20)
insert into input values (3, 24)
insert into input values (4, 40)
insert into output values (1, 5)
insert into output values (2, 7)
insert into output values (3, 3)
insert into output values (4, 16)
insert into output values (5, 4)
insert into output values (6, 13)
insert into output values (7, 31)
select input.id, input.amount, sum(nvl(in2.amount,00)) as samount ;
from input left join input in2 on input.id>in2.id ;
group by input.id, input.amount into cursor y
select output.id, output.amount, sum(nvl(ou2.amount,00)) as samount ;
from output left join output ou2 on output.id>ou2.id ;
group by output.id, output.amount into cursor z
select y.id as id_in, z.id as id_out, y.samount+y.amount-z.samount as amount ;
from y join z on ;
z.samount>=y.samount and z.samount<=y.samount+y.amount and ;
z.samount+z.amount>=y.samount+y.amount ;
union ;
select y.id as id_in, z.id as id_out, z.samount+z.amount-y.samount as amount ;
from y join z on ;
z.samount<=y.samount and z.samount+z.amount>=y.samount and ;
z.samount+z.amount<=y.samount+y.amount ;
union ;
select y.id as id_in, z.id as id_out, z.amount as amount from y join z on ;
z.samount>=y.samount and z.samount+z.amount<=y.samount+y.amount ;
union ;
select y.id as id_in, z.id as id_out, y.amount as amount from y join z on ;
z.samount<=y.samount and z.samount+z.amount>=y.samount+y.amount ;
order by 1,2
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
Prudivus
Автор

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
leonid
Похоже что правильно, если можно - несколько комментариев и итоговую таблицу в студию.
Комментарии прошу потому как у меня код sql чуток другой.



Исправлено 1 раз(а). Последнее : Prudivus, 01.03.07 15:11
Ratings: 0 negative/0 positive
Re: Вопросы не для собеседования 1
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Prudivus
Цитата:
внутри запроса понятий первый/последний/следущий/предыдущий вроде как в принципе нет
order by
Батенька, order by - это не внутри, а снаружи, сортировка готового результата.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 1 (Гостей: 1)

© 2000-2024 Fox Club 
Яндекс.Метрика