Задания по SQL. Информация о базе данных "Фирма вторсырья"
Скачать 15.46 Kb.
|
Краткая информация о базе данных "Фирма вторсырья": Фирма имеет несколько пунктов приема вторсырья. Каждый пункт получает деньги для их выдачи сдатчикам вторсырья. Сведения о получении денег на пунктах приема записываются в таблицу: Income_o(point, date, inc) Первичным ключом является (point, date). При этом в столбец date записывается только дата (без времени), т.е. прием денег (inc) на каждом пункте производится не чаще одного раза в день. Сведения о выдаче денег сдатчикам вторсырья записываются в таблицу: Outcome_o(point, date, out) В этой таблице также первичный ключ (point, date) гарантирует отчетность каждого пункта о выданных деньгах (out) не чаще одного раза в день. В случае, когда приход и расход денег может фиксироваться несколько раз в день, используется другая схема с таблицами, имеющими первичный ключ code: Income(code, point, date, inc) Outcome(code, point, date, out) Здесь также значения столбца date не содержат времени. Задание 5. Найти такие пункты приема, которые имеют в таблице Outcome записи на каждый рабочий день в течение некоторой недели (календарные дни, исключая субботу и воскресенье). Вывод: номер пункта, дата понедельника полной рабочей недели в формате "YYYY-MM-DD", суммарное значение out за эту рабочую неделю. Задание 6. Фирма открывает новые пункты по приему вторсырья. При открытии, каждому из них были выданы "подъемные" в размере 20 т.р. Каждому из пунктов была поставлена задача об увеличении первоначального капитала до 150%, с отчетностью - один раз в день. Используя одну только таблицу Outcome_o и при условии, что пункты работают с двойной накруткой, то есть на каждый выплаченный сдатчику рубль они получают доход 2 рубля, найти: - Для пунктов, справившихся с заданием, определить дату его выполнения и сумму денежных средств, полученных сверх плана на эту дату; - Для пунктов, которые не справились с заданием, определить на последнюю отчетную дату сумму денежных средств, недостающих до его выполнения. Вывод: пункт, дата выполнения (или последний день), сумма сверх плана (или недостающую сумму до плана). Краткая информация о базе данных "Аэрофлот": Company (ID_comp, name) Trip(trip_no, ID_comp, plane, town_from, town_to, time_out, time_in) Passenger(ID_psg, name) Pass_in_trip(trip_no, date, ID_psg, place) Таблица Company содержит идентификатор и название компании, осуществляющей перевозку пассажиров. Таблица Trip содержит информацию о рейсах: номер рейса, идентификатор компании, тип самолета, город отправления, город прибытия, время отправления и время прибытия. Таблица Passenger содержит идентификатор и имя пассажира. Таблица Pass_in_trip содержит информацию о полетах: номер рейса, дата вылета (день), идентификатор пассажира и место, на котором он сидел во время полета. При этом следует иметь в виду, что: - рейсы выполняются ежедневно, а длительность полета любого рейса менее суток; town_from <> town_to; - время и дата учитывается относительно одного часового пояса; - время отправления и прибытия указывается с точностью до минуты; - среди пассажиров могут быть однофамильцы (одинаковые значения поля name, например, Bruce Willis); - номер места в салоне – это число с буквой; число определяет номер ряда, буква (a – d) – место в ряду слева направо в алфавитном порядке; - связи и ограничения показаны на схеме данных. Задание 7. Номера рейсов, упорядоченные по возрастанию, конкатенировать в строку. Разбить полученную строку по 3 символа, начиная слева; лишние символы отбросить. Считая каждую трехсимвольную строку числом, найти сумму таких чисел, а также минимальное и максимальное значения. Вывод: минимальное значение, максимальное значение, сумма значений. Решение: Первую часть я решил (Номера рейсов, упорядоченные по возрастанию, конкатенировать в строку): DECLARE @Result varchar(max)='' SELECT @Result = concat(@Result, t.[trip_no]) FROM (select trip_no from Trip orders by trip_no) t SELECT @Result as ttt Третья часть тоже понятна (найти сумму таких чисел, а также минимальное и максимальное значения), тут все элементарно. А вот со второй частью пока не понятно (Разбить полученную строку по 3 символа, начиная слева; лишние символы отбросить). |