УП СУБД ч1
.pdfПриложение
В Приложении приведены примеры SQL-запросов к базе данных электронных копий таможенных деклараций.
1. Поиск деклараций, оформленных на Астраханской таможне (код 10302) за январь месяц, импорт из Азербайджана или Ирана:
select * from dclhead
where substr( g071, 1, 5 ) = ‘10302’ and g011 = ‘ИМ’
and to_char( g072, ‘MM’ ) = ‘01’ and g15 in ( ‘АЗЕРБАЙДЖАН’,
‘ИРАН, ИСЛАМСКАЯ РЕСПУБЛИКА’)
В подобных запросах рекомендуется для отбора по условию ИЛИ для нескольких значений использовать предикат IN.
2. Вычисление таможенной стоимости для каждой таможни:
select substr( g071, 1, 5 ) || ‘000’ «Код таможни», sum( g45 ) «Таможенная стоимость»
from dcltovar
group by substr( g071, 1, 5 ) || ‘000’
Здесь используется группировка по коду таможенного органа и вычисление агрегатной функции от поля g45.
3. Для каждой страны происхождения товара вычисление суммарной таможенной стоимости (раздельно для импорта и экспорта):
select nvl(g15, ‘неизвестна’) «Страна происхождения», g011, sum( g45 ) «Таможенная стоимость»
from dcltovar T join dclhead H using (g071, g072, g073) group by nvl(g15, ‘неизвестна’), g011
order by nvl(g15, ‘неизвестна’), g011;
Обратите внимание на то, что соединение таблиц выполняется при помощи конструкции using по указываемым полям.
4. Вычисление суммарных таможенной стоимости и общего веса для каждой таможни, товарной группы, страны происхождения по каждому месяцу (только для импорта):
141
select substr( g071, 1, 5 ) || ‘000’ «Код таможни», substr( g33, 1, 2 ) «Товарная группа»,
nvl(g15, ‘неизвестна’) «Страна происхождения», to_char( g072, ‘MM’ ) «Месяц»,
sum( g45 ) «Таможенная стоимость», sum( g35 ) «Вес брутто»
from dcltovar T join dclhead H using (g071, g072, g073) where g011 = ‘ИМ’
group by substr( g071, 1, 5 ) || ‘000’, substr( g33, 1, 2 ) ,
nvl(g15, ‘неизвестна’), to_char( g072, ‘MM’ )
5. Вычисление для каждого вида платежа суммы платежа и общей суммы по всем видам платежей:
select substr( g471, 1, 2 ) «Вид платежа», sum( g474) «Сумма»
from dclplatr
group by substr( g471, 1, 2 ) union
select ‘Итого:’, sum( g474) from dclplatr
Здесь используется множественной оператор union, который объединяет в одно результирующее множество значения двух различных запросов, первый из которых выполняет группировку по виду платежа и вычисляет агрегатную функцию, а второй вычисляет сумму по всем записям без группировки.
6. Определение таможни с максимальной суммой статистических стоимостей товаров.
В принципе, это значение может быть получено следующим запросом (первая строчка результирующего множества):
select substr( g071, 1, 5 )|| ‘000’, sum(g46) from dcltovar
group by substr( g071, 1, 5 ) || ‘000’ order by sum (g46) desc
Можно, тем не менее, составить запрос, который будет выдавать только одну требуемую запись:
142
select substr( g071, 1, 5 )|| ‘000’, sum (g46) from dcltovar group by substr( g071, 1, 5 ) || ‘000’
having sum (g46) >= all
(select sum (g46) from dcltovar
group by substr( g071, 1, 5 ) || ‘000’)
Здесь используется запрос с подзапросом, которые выполняют одну и ту же группировку и агрегирование таблицы. Подзапрос вычисляет список максимальных значений, а основной запрос выполняет вторичную селекцию результирующего множества после группировки, оставляя только одну запись, которая больше всех значений, кроме самой себя.
Если необходимо найти, например, две таможни с максимальными суммами, можно использовать следующий запрос:
select * from
(select substr( g071, 1, 5 ) || ‘000’, sum(G46) from dcltovar group by substr( g071, 1, 5 ) || ‘000’
order by sum(G46) desc ) where rownum <= 2;
Здесь вложенный подзапрос формирует упорядоченное результирующее множество суммарных стоимостей по каждой таможне; основной запрос извлекает из результирующего множества подзапроса только первые две записи.
7. Определение товаров, на которые начислена НДС, но не начислена ввозная пошлина:
select g071, g072, g073, g32, g471 from dclplatr P
where p.g471=’5010’ and not exists
( select * from dclplatr A
where a.g471 = ‘2010’ and P.g071 = a.g071 and P.g072 = a.g072 and P.g073 = a.g073 and P.g32 = a.G32);
Здесь основной запрос перебирает записи только с кодом платежа 5010, а подзапрос для каждой строки внешнего запроса проверяет, что в той же таблице записи с теми же номерами деклараций и товаров нет записи с кодом платежа 2010.
143
Указатели
Команды |
страницы |
|
|
CREATE TABLE |
55 |
DELETE |
134 |
DESCR |
56 |
INSERT |
131 |
SELECT |
55 |
TRUNCATE |
135 |
UPDATE |
135 |
Конструкции |
|
|
|
AS |
58 |
FROM |
56 |
HAVING |
92 |
GROUP BY |
87 |
ORDER BY |
59 |
WHERE |
59 |
Логические предикаты |
|
|
|
ALL |
124 |
ANY |
124 |
BETWEEN |
84 |
EXISTS |
123 |
IN |
84 |
IS NULL, IS NOT NULL |
99 |
LIKE |
83 |
Множественные операции |
|
|
|
INTERSECT |
93 |
MINUS |
93 |
UNION |
93 |
UNION ALL |
93 |
144
Оператор CASE |
75 |
Операции соединения |
|
|
|
CROSS JOIN |
105 |
FULL JOIN |
108 |
INNER JOIN |
116 |
JOIN USING |
106 |
LEFT JOIN, RIGHT JOIN |
107 |
NATURAL JOIN |
105 |
Функции |
|
|
|
CAST |
73 |
CEIL |
65 |
COS |
65 |
COUNT |
58 |
DECODE |
75 |
FLOOR |
65 |
INITCAP |
66 |
LAST_DAY |
70 |
LENGTH |
66 |
LOWER |
66 |
LPAD |
66 |
LTRIM |
66 |
REPLACE |
66 |
RPAD |
66 |
RTRIM |
66 |
SIN |
65 |
SUBSTR |
66 |
SYSDATE |
69 |
TO_CHAR |
71 |
TO_DATE |
72 |
TO_NUMBER |
72 |
TRUNC |
65 |
UPPER |
66 |
145
Учебное издание
Заставной Дмитрий Александрович
Системы управления базами данных и язык Oracle SQL
Часть 1
Редактор Е.И. Барабанова
Оригинал-макет И.В. Литвинова
Подписано в печать 05.04.2013.
Формат 64х84/16 Ксерокопия. Таймс. Усл.п.л. 8,5. Тираж 50 экз. Заказ 3584.
Российская таможенная академия Ростовский филиал.
344002, г. Ростов-на-Дону, пр. Буденновский, 20.
146