Шаг 11 - Выборка данных с помощью SELECT, часть 2

Идем дальше! Давайте, выполним вот такой запрос:

Вывести для каждого из офисов список городов, регионов и объемов продаж.

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' и есть столбец константа. Просто и со вкусом! Пока надо пойти попить кофе и покурить, хотя это вредно!!! И курить тоже!!! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 10.08.03