Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KR_BD_V20.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
5 Мб
Скачать
☆

Задача 8.

Виготовити запит з відомостями про путівки фірми. Забезпечити відповідний напис для зимових путівок, тобто там, де дата початку маршруту припадає на місяці від грудня до лютого включно.

Розв'язок задачі

SELECT *, CASE WHEN extract( month from oblik_realizaciy.data) = 12 OR extract( month from oblik_realizaciy.data) = 1 OR

extract( month from oblik_realizaciy.data) = 2 THEN 'Зимові путівки!' END AS zima FROM oblik_realizaciy

INNER JOIN marshrut ON marshrut.nom=oblik_realizaciy.nom

INNER JOIN prozgyvannya ON marshrut.k_u_p = prozgyvannya.k_u_p

INNER JOIN harchuvannya ON marshrut.k_u_h = harchuvannya.k_u_h

WHERE extract (month from oblik_realizaciy.data) = 12 OR extract( month from oblik_realizaciy.data) = 1 OR

extract( month from oblik_realizaciy.data) = 2;

Результати запиту:

5.4 Завдання 4

Виготовити звіт про розподіл кількості путівок з певними умовами проживання по умовах харчування. Навпроти умов проживання встановити кількість путівок для кожного виду харчування. Передбачити підсумки по вертикалі і по горизонталі.

Розв'язок задачі

CREATE OR REPLACE FUNCTION zvit() RETURNS text AS

$$

DECLARE

--оголошення запису

rec RECORD;

--оголошення змінної

kod_u_p prozgyvannya.k_u_p %TYPE = 0;

all_text text := ' ';

BEGIN

all_text:=repeat(' ', 20)||'Звіт'||E'\n';

FOR rec IN SELECT marshrut.kil_p, marshrut.k_u_p AS m_k_u_p, marshrut.k_u_h AS m_k_u_h,

prozgyvannya.k_u_p AS p_k_u_p, harchuvannya.k_u_h AS h_k_u_h,

prozgyvannya.u_p, harchuvannya.u_h FROM marshrut

INNER JOIN prozgyvannya ON marshrut.k_u_p = prozgyvannya.k_u_p

INNER JOIN harchuvannya ON marshrut.k_u_h = harchuvannya.k_u_h

ORDER BY marshrut.k_u_p

LOOP

IF kod_u_p <> rec.m_k_u_p

THEN

all_text := all_text||rec.u_p||E':\n'||repeat(' ',5)||rpad(rec.u_h,30, '-')||TO_CHAR(rec.kil_p, '99')||E'\n';

ELSE

all_text := all_text||repeat(' ',5)||rpad(rec.u_h,30, '-')||TO_CHAR(rec.kil_p, '99')||E'\n';

END IF;

kod_u_p := rec.m_k_u_p;

END LOOP;

RETURN all_text;

END;

$$

language plpgsql;

select zvit();

Результат задачі

Задача 6,9

Виготовити звіт про “гарячі“ путівки, тобто такі, що ще незакуплені, а до початку маршруту залишилося менше 6 днів. У звіт включити дані про номер і назву маршруту, ціну за одну путівку та кількість путівок, які ще залишилися. До заголовка звіту додати слова “станом на ” і встановити поточну дату.

Скласти програму для видачі звіту за умовою цього завдання, використати курсор.

Розв’язок задачі

CREATE OR REPLACE FUNCTION zvit() RETURNS text AS

$$

DECLARE

--оголошення змінних, масиву, курсору

nomer marshrut.nom %TYPE; imya marshrut.name %TYPE; cina marshrut.cina %TYPE;

den INTEGER; mis INTEGER; rik INTEGER; ms CHARACTER(9) ARRAY[12];

slovo text; sum_1 marshrut.kil_p %TYPE;

kursor CURSOR FOR SELECT marshrut.nom, marshrut.name, marshrut.cina , sum(marshrut.kil_p-oblik_realizaciy.kil_p_p) AS sum FROM oblik_realizaciy

INNER JOIN marshrut ON (marshrut.nom=oblik_realizaciy.nom)

WHERE extract(day FROM data)< extract(day FROM current_date) + 6

AND extract (month FROM data)=extract (month FROM current_date)

AND extract (year FROM data)=extract (year FROM current_date)

GROUP BY marshrut.nom,marshrut.name,marshrut.cina

ORDER BY name;

BEGIN

--заповнення масиву даними

den:=EXTRACT(DAY FROM CURRENT_DATE);

mis:=EXTRACT(MONTH FROM CURRENT_DATE);

rik:=EXTRACT(YEAR FROM CURRENT_DATE);

ms[1]:='січня';ms[2]:='лютого';ms[3]:='березня';ms[4]:='квітня';ms[5]:='травня';ms[6]:='червня';

ms[7]:='липня';ms[8]:='серпня';ms[9]:='вересня';ms[10]:='жовтня';ms[11]:='листопада';ms[12]:='грудня';

SELECT INTO nomer nom, marshrut.cina cina FROM marshrut;

slovo:=' Звіт'||E'\n';

slovo:=slovo ||'про "гарячі" путівки, що ще не закуплені, а до початку маршруту залишилося менше 6 днів'||E'\n';

slovo:=slovo ||' станом на: '||TO_CHAR(den,'99')||' '||ms[mis]||' '|| TO_CHAR(rik,'9999')||E'\n\n';

slovo:=slovo ||' Номер'||' '||' Путівка'||' '||'Ціна за 1 путівку:'||' '||'Кількість'||E'\n';

slovo:=slovo ||' ---------------------------------------------------------------------------'||E'\n';

open kursor;

LOOP

FETCH kursor INTO nomer,imya,cina,sum_1;

exit when not found;

slovo:=slovo ||' '||nomer||' '||rpad(imya,30,' ')||cina||' '||TO_CHAR(sum_1,'9')||E'\n';

END LOOP;

CLOSE kursor;

RETURN slovo;

END;

$$

language plpgsql;

select zvit();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]