Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2010, 11:17   #1
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию Пятничная задачка №1

Всех причастных к сегодняшней дате - с праздником!

Хочется открыть серию занятных задач для любителей пошевелить мозгами. В разделе "Язык SQL" обычно не совсем уж "детские" вопросы возникают, но действительно интересные можно пересчитать по пальцам руки.

Задачки сами по себе из "жизни" и наверняка кому-то даже пригодятся решения. Сама постановка задач будет удобна для ораклистов, но ничто не мешает накатить тестовые данные в любой другой субд самостоятельно. Соответственно, бОльшую часть решений буду ждать опять же от ораклистов, но по силам они будут так же и МССКуэльщикам и, скорее всего, ФБердовцам. Но, как бы там ни было, приветствуются любые решения, достигающие цели.

Итак, задачка:
Цитата:
Имеем две таблицы данных:
t1 - таблица продаж,
t2 - таблица приходов
Айтемы продаж и приходов не связаны между собой сквозной нумерацией и поэтому невозможно понять с какого айтема прихода была сделана продажа.
Требуется раскидать айтемы прихода (кол-во * цену) по айтемам продаж с целью вычисления валовой прибыли с группировкой по клиенту. Цена равна сумма деленая на кол-во (price = amount / qty). При этом важно учитывать условие движения товаров в соответствии с методом ФИФО (первым пришел первым ушел).
Задачу нужно решить в идеале одним запросом. Остальные решения тоже приветствуются.
собственно тестовые данные для задачи:
Код:
with
  t1 as (
  select 1 inv_kind, to_date('01.01.2007', 'DD.MM.YYYY') inv_date, 3 qty, 15000 amount, 'PPP' client from dual union all
  select 1, to_date('01.05.2007', 'DD.MM.YYYY'), 30, 250000, 'PPP' from dual union all
  select 1, to_date('11.03.2007', 'DD.MM.YYYY'), 30, 250000, 'AAA' from dual union all
  select 1, to_date('04.07.2007', 'DD.MM.YYYY'), 30, 250000, 'PPP' from dual union all
  select 1, to_date('25.10.2007', 'DD.MM.YYYY'), 5, 40000, 'BBB' from dual union all
  select 1, to_date('21.12.2007', 'DD.MM.YYYY'), 130, 990000, 'PPP' from dual
  ),
  t2 as (
  select 2 inv_kind, to_date('21.12.2006', 'DD.MM.YYYY') inv_date, 23 qty, 23000 amount, '' client from dual union all
  select 2, to_date('12.01.2007', 'DD.MM.YYYY'), 50, 25000, '' from dual union all
  select 2, to_date('12.04.2007', 'DD.MM.YYYY'), 100, 50000, '' from dual union all
  select 2, to_date('12.12.2007', 'DD.MM.YYYY'), 55, 27500, '' from dual
  )
В итоге должна быть возможность посмотреть как группировку по клиентам, так и деталировку по накладным (как они между собой сочетаются).
Для проверки правильности решения можно сравниться с результатом:
Цитата:
Клиент Приход Продажа Прибыль
AAA 25000 250000 225000
BBB 2500 40000 37500
PPP 98000 1505000 1407000
Итого 125500 1795000 1669500
добавочка
1) в данном примере считается что в каждой накладной продается один и тот же товар
2) в данном примере праймари по накладным включает в себя только дату накладной (т.е. в один день не м.б. больше одной продажи и прихода)
при желании можно навтыкать в тестовый пример номера накладных


З.Ы.: в постскриптуме к ответам можно и нужно высказываться о "интересности и нужности" таких задачек либо обратном

Последний раз редактировалось soleil@mmc; 30.07.2010 в 16:33.
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка!!! Аксинья Общие вопросы C/C++ 2 21.05.2009 21:38
Задачка на БД Paul Oakenfold Паскаль, Turbo Pascal, PascalABC.NET 5 15.05.2009 16:07
задачка lucky Помощь студентам 1 07.05.2009 13:49
Задачка на С!!! Exorcist Помощь студентам 1 07.12.2008 21:15