Идем дальше! Давайте, выполним вот такой запрос:
Вывести для каждого из офисов список городов, регионов и объемов продаж.
SQL> SELECT CITY, REGION, SALES 2 FROM OFFICES 3 / CITY REGION SALES ------------------------------ ------------------------------ --------- Запиндрищинск Запад 186,042 Красный Мотоцикл Восток 692,637 Чугуевск Восток 735,044 Бубурино Восток 367,911 Котрогайка Запад 835,915
Нечто подобное мы уже проделывали, но я повторяюсь, вот почему. Чтобы вы поняли, что это "простой запрос", возвращающий все записи из трех, столбцов таблицы OFFICES. Вот на этом все, надеюсь объяснять больше ничего не нужно! Теперь давайте вернемся к теме "вычисляемые столбцы", как я уже говорил, любой из возвращаемых, столбцов, оператора SELECT, может быть "вычисляемым", что это значит. А то, что это не столбец из запрашиваемой таблицы, а некое математическое, выражение представленное в результирующем, наборе запроса как самостоятельный столбец! То есть фактически, столбца с такими значениями и именем в запрашиваемой таблице нет(!), он просто-напросто получается в результате математического, вычисления! Понятно? Пробуем: Выдать для каждого офиса список, городов, регионов и сумм, на которые перевыполнен/недовыполнен план по продажам.
SQL> SELECT CITY, REGION, (SALES-TARGET) 2 FROM OFFICES 3 / CITY REGION (SALES-TARGET) ------------------------------ ------------------------------ -------------- Запиндрищинск Запад -113,958 Красный Мотоцикл Восток 117,637 Чугуевск Восток -64,956 Бубурино Восток 17,911 Котрогайка Запад 110,915
Столбец с именем (SALES-TARGET) и есть вычисляемый! А, можно вот так, используя правила и возможности сервера Oracle!
SQL> COL CITY FORMAT A18 SQL> SELECT CITY, REGION, '$ '||(SALES-TARGET) AS STOIM 2 FROM OFFICES 3 / CITY REGION STOIM ------------------ ------------------------------ ------------------ Запиндрищинск Запад $ -113,958 Красный Мотоцикл Восток $ 117,637 Чугуевск Восток $ -64,956 Бубурино Восток $ 17,911 Котрогайка Запад $ 110,915
Теперь нагляднее, не правда ли? Вместо чего-то мало понятного (SALES-TARGET) стоит STOIM просто имя столбца! А перед, цифрами появился, наш любимый знак Российской (тьфу ты Американской!) валюты, доллара! отсюда можно сделать четкий вывод, что Запиндрищинск и Чугуевск, пролетают с премиями! :) А, теперь немного забегая вперед, поясню, что это за выражение '$ '||(SALES-TARGET) AS STOIM. '$ ' - строковый литерал, включающий строку, из двух символов $ и пробел, ||- знак конкатенации строковых литералов (а, в языке C и C++ выражение ИЛИ! Привет программистам! Не путайтесь!), (SALES-TARGET) - собственно вычисляемое выражение, ну и предикат AS STOIM - буквально, назвать столбец как STOIM! Вот собственно небольшой экскурс, в PL/SQL! Но им мы будем заниматься, позже и более подробно!!! Таким образом, мы получили небольшой отчет для выявления недобросовестных, работников!
Идем дальше, попробуем вот еще что: Показать общую стоимость по каждому товару.
SQL> SELECT MFR_ID, PRODUCT_ID, DESCRIPTION, (QTY_ON_HAND * PRICE) 2 FROM PRODUCTS 3 / MFR PRODU DESCRIPTION (QTY_ON_HAND*PRICE) --- ----- -------------------------------------------------- ------------------- REI 2A45C Бочка металлическая 16590 ACI 4100Y Коробка картонная 68,75 QSA XK47 Труба алюминиевая 13490 BIC 41672 Тарелка фарфоровая 0 IMM 779C Профиль специальный 16875 ACI 41003 Рейка деревянная 22149 ACI 41004 Рейка пластмассовая 16263 BIC 41003 Стекломаст рулоны 1956 IMM 887P Рубероид рулоны 6000 QSA XK48 Гвоздь длинный 27202 REI 2A44L Доска профильная 54000 FEA 112 Стол офисный 17020 IMM 887H Тумбочка прикроватная 12042 BIC 41089 Сапоги юфтевые 17550 ACI 41001 Лампа настольная 15235 IMM 775C Осветитель ртутный 7125 ACI 4100Z Монитор LG 70000 QSA XK48A Подушка ватная 6549 ACI 41002 Носки черные 12692 REI 2A44R Телевизор SAMSUNG 54000 IMM 773C Наушники SONY 27300 MFR PRODU DESCRIPTION (QTY_ON_HAND*PRICE) --- ----- -------------------------------------------------- ------------------- ACI 4100X Карандаш простой 925 FEA 114 Электродвигатель 3645 IMM 887X Нож специальный 15200 REI 2A44G Бочка пластмассовая 4900 25 строк выбрано.
Или вот так:
SQL> COL STOIM FORMAT A12 SQL> SELECT MFR_ID, PRODUCT_ID, DESCRIPTION, '$ '||(QTY_ON_HAND * PRICE) AS STOIM 2 FROM PRODUCTS 3 / MFR PRODU DESCRIPTION STOIM --- ----- -------------------------------------------------- ------------ REI 2A45C Бочка металлическая $ 16590 ACI 4100Y Коробка картонная $ 68,75 QSA XK47 Труба алюминиевая $ 13490 BIC 41672 Тарелка фарфоровая $ 0 IMM 779C Профиль специальный $ 16875 ACI 41003 Рейка деревянная $ 22149 ACI 41004 Рейка пластмассовая $ 16263 BIC 41003 Стекломаст рулоны $ 1956 IMM 887P Рубероид рулоны $ 6000 QSA XK48 Гвоздь длинный $ 27202 REI 2A44L Доска профильная $ 54000 FEA 112 Стол офисный $ 17020 IMM 887H Тумбочка прикроватная $ 12042 BIC 41089 Сапоги юфтиевые $ 17550 ACI 41001 Лампа настольная $ 15235 IMM 775C Осветитель ртутный $ 7125 ACI 4100Z Монитор LG $ 70000 QSA XK48A Подушка ватная $ 6549 ACI 41002 Носки черные $ 12692 REI 2A44R Телевизор SAMSUNG $ 54000 IMM 773C Наушники SONY $ 27300 MFR PRODU DESCRIPTION STOIM --- ----- -------------------------------------------------- ------------ ACI 4100X Карандаш простой $ 925 FEA 114 Электродвигатель $ 3645 IMM 887X Нож специальный $ 15200 REI 2A44G Бочка пластмассовая $ 4900 25 строк выбрано.
Нагляднее, верно! Да и знак $, глаз радует!
А, что если увеличить плановый объем продаж, для каждого служащего, на 3% от его фактического, объема продаж! Да, без проблем! Внимательно посмотрите вычисляемое выражение, так работает Oracle!
SQL> SELECT NAME, QUOTA, (QUOTA +((SALES/100)*3)) 2 FROM SALESREPS 3 / NAME QUOTA (QUOTA+((SALES/100)*3)) ------------------------------ --------- ----------------------- Вася Пупкин 350 361,03733 Маша Распутина 300 311,78175 Филип Киркоров 350 364,2215 Света Разина 275 283,99736 Наташа Королева 200 204,27782 Игорь Николаев 300 309,17019 Крис Кельми Игорь Петров 350 360,85595 Дима Маликов 275 283,60325 Маша Сидорова 300 305,58126 Максим Галкин 400 411,58126 11 строк выбрано.
Получилось! Главное что бы Максим Галкин не надорвался! А, чего ему сделается, в армию все равно не пойдет! Заработает! Ну, да бог ему судья! :) Остановимся, еще вот на таком аспекте, как столбец, константа. Что, он из себя представляет? Иногда, требуется, что бы один из столбцов запрос возвращал, одно и то же значение не зависимо, от условий поиска!
Например: Вывести список объемов продаж, для каждого города.
SQL> SELECT CITY, 'Has sales of', SALES 2 FROM OFFICES 3 / CITY 'HASSALESOF' SALES ------------------------------ ------------ --------- Запиндрищинск Has sales of 186,042 Красный Мотоцикл Has sales of 692,637 Чугуевск Has sales of 735,044 Бубурино Has sales of 367,911 Котрогайка Has sales of 835,915
'Has sales of' и есть столбец константа. Просто и со вкусом! Пока надо пойти попить кофе и покурить, хотя это вредно!!! И курить тоже!!! :)