Вычисляемые поля в SQL-запросе. Вычисляемые поля sql


Вычисление полей в функциях SQL

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

Аргумент строковое выражение в статистические функции SQL можно использовать для выполнения вычислений на значения в поле. Например можно вычислить процент (например, распределению или налогов) умножается на значение поля дроби.

В таблице ниже приведены примеры вычисления на поля из таблиц в базе данных Northwind.mdb заказы и сведения о заказе.

Вычисление 

Пример

Добавление номера в поле

Freight + 5

Вычитание числа из поля

Freight - 5

Умножение поле на число

UnitPrice * 2

Деление поле на число

Freight / 2

Добавить одно поле

UnitsInStock + UnitsOnOrder

Вычитание одного поля из другого

ReorderLevel - UnitsInStock

В следующем примере вычисляется величина средней скидки для всех заказов в базе данных Northwind.mdb. Он умножает значения в полях UnitPrice и скидка, чтобы определить величину скидки для каждого заказа и затем заново вычисляет среднее значение. Это выражение можно использовать в инструкцию SQL в коде Visual Basic:

SELECT Avg(UnitPrice * Discount) AS [Average Discount] FROM [Order Details];

support.office.com

Вычисляемые поля в SQL-запросе Безопасный SQL

Недопустимое имя столбца ItemA , ItemB , ItemC , ItemE и ItemE

Я переношу это из Прогресс в SQL и не могу ссылаться на вычисленные поля в запросе. После исследования ошибки, кажется, единственным решением является замена каждого элемента на полное выражение или создание вложенного оператора select. В этом случае, похоже, не работает.

SELECT OrderQty - (ItemE + ShippedQty) AS ItemA, ((CASE WHEN (ItemA > ItemB AND ItemA > 0) THEN (ItemA - ItemB) ELSE 0 END)) AS ItemC, UnitPrice * ItemC AS ItemD, ((CASE WHEN OnHandQty > (ReservedQty + PickingQty) THEN OnHandQty - (ReservedQty + PickingQty) ELSE 0 END)) AS ItemB, ((CASE WHEN ReservedQty > - 1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END)) AS ItemE, -- Example of enumerated expression that is far to confusing to continue. SELECT OrderQty - (((CASE WHEN ReservedQty > -1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END)) + ShippedQty), ((CASE WHEN (OrderQty - ((CASE WHEN ReservedQty > -1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END)) > ((CASE WHEN OnHandQty > (ReservedQty + PickingQty) THEN OnHandQty - (ReservedQty + PickingQty) ELSE 0 END)) AND (OrderQty - (ItemE + ShippedQty) > 0) THEN (OrderQty - (ItemE + ShippedQty) ELSE 0 END)))), UnitPrice * ((CASE WHEN (ItemA > ItemB AND ItemA > 0) THEN (ItemA - ItemB) ELSE 0 END))...
Solutions Collecting From Web of "Вычисляемые поля в SQL-запросе"

Если вы переходите на SQL Server, вы можете использовать предложения CROSS APPLY для создания псевдонимов для каждого из вычисленных полей:

SELECT x.ItemA, t.ItemC, UnitPrice * t.ItemC AS ItemD, y.ItemB, z.ItemE FROM mytable CROSS APPLY (SELECT CASE WHEN ReservedQty > - 1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END) z(ItemE) CROSS APPLY (SELECT OrderQty - (ItemE + ShippedQty)) x(ItemA) CROSS APPLY (SELECT CASE WHEN OnHandQty > (ReservedQty + PickingQty) THEN OnHandQty - (ReservedQty + PickingQty) ELSE 0 END) y(ItemB) CROSS APPLY (SELECT CASE WHEN (x.ItemA > y.ItemB AND x.ItemA > 0) THEN (x.ItemA - y.ItemB) ELSE 0 END) AS t(ItemC)

Демоверсия SQLFiddle

sql.fliplinux.com

7. Создание вычисляемых полей » СтудИзба

7. Создание вычисляемых полей

Данные, хранимые в таблицах базы данных. Обычно бывают представлены не в таком виде, который необходим для ваших приложений. Например.

1)      Необходимо отразить поле, содержащее имя компании с ее адресом, но эта информация расположена в разных столбцах таблицы.

2)      Город, штат и ZIP-код хранятся в отдельных столюцах, но для программы печати почтовых наклеек необходима эта информиация в одном, корректно сформированном поле.

3)      В таблице с предметами заказа хранятся цены продуктов и  их количество, но не полная цена каждого продукта. Чтобы распечатать счет , необходимы полные цены.

4)      Необходимы общая сумма, среднее значение или результаты других расчетов, основанных на данных, имеющихся в таблице.

 

Вместо того чтобы извлекать эти данные, а затем изменять их форму при помощи клиентского приложения или отчета, лучше извлекать уже преобразованные, подсчитанные или отформатированные данные прямо из базы данных. Термин поле означает то же самое, что и столбец. Хотя поле относят к вычисляемым столбцам.

База данных знает, какие столбцы в операторе SELECT являются реальными столбцами, а какие – вычисляемыми полями. С точки зрения клиента (приложения), данные вычисляемого поля возвращаются точно так же, как и данные из любого другого столбца.

Многие преобразования могут выполнить и клиентские приложения, но эти операции гораздо быстрее выполняются на сервере базы данных.

 

7.1.  Конкатенация полей

 

Конкатенация значений – это присоединение их друг к другу для получения одного длинного значения.

В качестве примера создадим заголовок, состоящий из значений двух столбцов. Необходимо создать отчет поставщику и указать его адрес как часть его имени в виде имя – адрес. В отчете должно быть одно значение, а данные в таблице хранятся в двух столбцах. В SQL-выражении SELECT можно выполнить конкатенацию двух столбцов при помощи специального оператора. В зависимости от СУБД это может быть знак + или две вертикальные черточки ||. В MS Access для конкатенации используется знак +.

 

SELECT vend_name + ‘(‘ + vend_country + ‘)’          формирование столбца

FROM Vendors                                                             из таблицы

ORDER BY vend_name;                                              упорядочить по столбцу 

--------------------------

 Expr1000

 Bear Emporium                         (USA                          )

 Beras R Us                            (USA                        )

 Doll House Inc.                        (USA                         )

 Fun and Games                         (England                     )

 Furball Inc.                           (USA                       )

 Jouets et ours                            (France                   )

 

Как видно из результата, выражение SELECT возвращает один столбец (вычисляемое поле), содержащий все четыре элемента как одно целое.

 

Примечание. В MySQL конкатенация не поддерживается при помощи оператора + или ||. Там используется функция CONCAT (), в которой указывается список элементов, по отношению к которым выполняется конкатенация. Пример имел бы следующий вид.

 

SELECT CONCAT(vend_name, ‘(‘,  vend_country, ‘)’           формирование столбца

FROM Vendors                                                                        из таблицы

ORDER BY vend_name;                                                         упорядочить по столбцу 

 

Для того, чтобы убрать ненужные пробелы необходимо использовать функцию RTRIM(). Эта функция отбрасывает все пробелы справа от указанного значения.  

 

SELECT RTRIM(vend_name) + ‘(‘ + RTRIM(vend_country) + ‘)’  

FROM Vendors                                                            

ORDER BY vend_name;                                             

--------------------------

 Expr1000

 Bear Emporium  (USA)

 Beras R Us(USA)

 Doll House Inc.(USA)

 Fun and Games(England)

 Furball Inc.(USA)

 Jouets et ours(France)

 

В большинстве СУБД поддерживается как функция RTRIM(), которая обрезает правую часть строки, так и LTRIM(), которая удаляет левую часть строки, а также TRIM(), которая обрезает строку слева и справа.

 

7.2.  Использование псевдонимов

 

Псевдоним – это альтернативное имя для поля или значения. Псевдоним применяется для именования вычисляемых полей. Псевдонимы присваиваются при помощи ключевого слова AS.

 

SELECT RTRIM(vend_name) + ‘(‘ + RTRIM(vend_country) + ‘)’ AS vend_title  

FROM Vendors                                                            

ORDER BY vend_name;                                             

--------------------------

 vend_title

 Bear Emporium  (USA)

 Beras R Us(USA)

 Doll House Inc.(USA)

 Fun and Games(England)

 Furball Inc.(USA)

 Jouets et ours(France)

 

К созданному имени столбца vend_title может обращаться любое клиентское приложение.

 

Примечание. 1) Псевдонимы можно использовать также для переименования столбца, если в реальном названии присутствуют недопустимые символы, например, пробелы или если название сложное и трудночитаемое.

2) Псевдонимом может служить как одно слово, так и целая строка. Если используется строка, она должна быть заключена в кавычки. Таким образом, псевдонимы используются для переименования многословных названий столбцов в однословные.

 

7.3.  Выполнение математических вычислений

 

Другой способ использования вычисляемых полей – это выполнение математических операций над выбранными данными.

В таблице Orders хранятся все полученные заказы, а в таблице OrderItems содержатся наименования продуктов для каждого заказа. Требуется осуществить выборку всех продуктов в заказе номер 20008.

 

SELECT prod_id, quantity, item_price             выбор столбцов

FROM OrderItems                                            из таблицы

WHERE order_num = 20008;                           условие выборки

--------------------------

prod_id                 quantity            item_price

RGAN01                        5                      4,99р.  

BR03                              5                    11,99р.

BNBG01                      10                     3,49р.  

BNBG02                       10                     3,49р.

BNBG03                      10                     3,49р.

 

В столбце item_price содержится цена на продукт для каждой записи, имеющейся в заказе. Необходимо узнать полную цену (цена за один продукт, умноженная на количество продуктов в заказе).

 

SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price

FROM OrderItems                                           

WHERE order_num = 20008;                          

--------------------------

prod_id                 quantity            item_price            expanded_price

RGAN01                        5                      4,99р.                         24.95  

BR03                              5                    11,99р.                         59.95

BNBG01                       10                     3,49р.                         34.90

BNBG02                       10                     3,49р.                         34.90

BNBG03                       10                     3,49р.                         34.90

 

Столбец expanded_price является вычисляемым полем. В ЫЙД поддерживаются основные математические операции:

+                     сложение

-                      вычитание

*                      умножение

/                       деление

 

 

 

studizba.com

Вычисляемые поля

При использовании команды выборки система VFP позволяет применять агрегирующие функции для организации работы с вычисляемыми полями. Выражение вычисляемого поля должно быть указано в основном списке полей. Можно использовать служебное слово AS для указания уникального имени вычисляемого поля в результирующей выборке.

Например:

SELECT cnmGoodsGrp, COUNT(icdGoods) AS Kolvo FROM Goods GROUP BY cnmGoodsGrp

в результате выполнения этой команды будет получена выборка, состоящая из двух полей cnmGoodsGrp и Kolvo, в которых будут содержаться наименования групп товаров и количество товаров в каждой группе.

SELECT Ordsaled.icdOrder, Ordsaled.icdGoods, (nOrderQuant*nUnitPrice) AS S1 FROM Ordsaled LEFT JOIN Goods ON Ordsaled.icdGoods=Goods.icdGoods

по этой команде результирующая выборка будет содержать информацию о номере заказа, номере товара и общей сумме за товар в данном заказе. Общая сумма будет помещена в поле с именем S1.

Запомните:

  1. Оператор SELECT – SQL замкнут относительно понятия таблицы, т.е. операции проводятся над таблицами и результатом является тоже таблица. Таким образом, допускается использование многократно вложенных операторов SELECT, когда выражение одного оператора входит в качестве источника или условия для другого оператора. Однако рекомендуется избегать вложенности по нескольким причинам, а именно: многократная вложенность существенно усложняет «читаемость» программного кода. В промышленных системах размеры сложного оператора SELECT могут превышать несколько экранных страниц, при этом очень сложно отследить логику запроса (даже если текст снабжен подробными комментариями). Решением данной проблемы могут служить несколько последовательных операторов выборки, когда результат предыдущего оператора в явном виде указан в следующем. Дополнительным удобством нескольких последовательных операторов можно считать возможный контроль промежуточных результатов, что позволяет отслеживать возможные ошибки вычислений. Единственным недостатком можно считать множество открываемых курсоров, которые требуется отслеживать и закрывать насильственно.

  2. Требования к синтаксису оператора SELECT – SQL в 9-й версии VFP были существенно усилены. Это иногда приводит к возникновению ошибок в, кажущихся простыми, запросах. Эти ошибки почти всегда возникают при указании группировки данных. При этом система требует, чтобы ко всем полям, указанным в группировке, были применены агрегирующие функции, что не всегда удобно. Снизить уровень требований, и соответственно избежать ошибок, можно командой SET ENGINEBEHAVIOR 70, которую допускается прописать в командном окне или непосредственно в теле самой программы. Восстановление уровня осуществляется командой SET ENGINEBEHAVIOR 90.

  3. В 9-й версии VFP было упразднено понятие ODBC драйверов, и вместо них введен OLE DB Provider. Это означает, что для доступа к базам данных, созданных в 9-й версии следует устанавливать фирменный OLE DB драйвер, который имеется в наличии в установочном комплекте, но автоматически не устанавливается. Доступ к остальным источникам через удаленные представления осуществляется по-старому, посредством использования источников данных ODBC.

Задания

  1. Выберите из таблицы всех покупателей, чей кредит превышает 1000.

  2. Выберите всех покупателей, живущих в России и Украине.

  3. Выберите всех покупателей, чей кредит находится в промежутке от 1000 до 50000.

  4. Создайте запрос, выводящий данные о каждом покупателе и каждом товаре, который данный покупатель хотя бы один раз заказывал. Если товар был заказан несколько раз, то в результате он должен быть включен только один раз.

  5. Сгруппируйте данные в предыдущем запросе вначале по заказчикам, а затем по товарам. Отметьте и объясните разницу в результатах.

  6. Выдайте на экран всех покупателей, которые сделали заказ на сумму превышающую 10000.

  7. Создайте представления данных, позволяющие отредактировать кредит каждого покупателя и стоимость одной единицы товара.

  8. Откройте созданные представления и измените некоторые данные из таблиц. После закрытия представлений убедитесь, что изменения были внесены в соответствующие таблицы.

  9. Создайте представление данных, позволяющее редактировать телефоны покупателей. Представление должно содержать ФИО покупателя (как единое целое, а не как три поля) и его телефон.

  10. Создайте представление данных, показывающее по каждому покупателю итоговую сумму его покупок за заданный период. В дальнейшем используйте это представление, как источник данных в отчете.

  11. Создайте представление данных, которое по полученной фамилии выдаст информацию обо всех покупках, совершенных этим покупателем. Обратите внимание, что пересчет данных, выведенных представлением данных, происходит только в момент его открытия. Для учета внесенных изменений необходимо закрыть представление и открыть его снова.

  12. Создайте источник данных для доступа к вашей базе данных, используя удаленное представление данных. После этого создайте временный проект Temp, который должен содержать только пустую базу данных. Создайте в этой базе данных удаленное представление данных, используя в качестве соединения созданный вами источник данных. Просмотрите созданное удаленное представление и сравните его данные с теми, что хранятся в самой базе данных. Попробуйте проделать то же самое с базой данных соседа.

studfiles.net

SQL и вычисляемые поля

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2003.07.10;Скачать: [xml.tar.bz2];

Вниз

SQL и вычисляемые поля 
Oleg-owl   (2003-06-15 03:20) [0]

Я начал недавно осваивать SQL и не знаю как получить реультат функции count(*) если в условии стоит вычисляемой поле, например select count(*) from ... where (price>100). Где price - вычисляемое поле. Помогите пожалуйста разобраться. Заранее благодарю

Suntechnic   (2003-06-15 05:27) [1]

О каких вычисляемых полях идёт речь? О тех, что в TTable можно добавить? Тогда при чём здесь SQL?

elena_m   (2003-06-15 23:42) [2]

функция count не вычисляет, а подсчитывает сколько раз встретилось в таблице заданное значение. В Вашем примере вы подсчитываете число строк, в которых поле price>100

Rol   (2003-06-16 06:21) [3]

Либо вложенный запрос, либо group by + having, либо и то, и другое. :) Без исходной постановки задачи сказать что-либо определённое невозможно.

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2003.07.10;Скачать: [xml.tar.bz2];

Наверх

EMAIL={{}};LOGIN={{Oleg-owl}};TITLE={{SQL и вычисляемые поля}};ATTRIBUTES={{}};ID_MSG={{517725}};ID_GROUP={{3}};ID_NNTP={{99263}};ID_DM={{31082}};REPLYNR={{0}};ID_DM_AUTHOR={{0}};ARCHIVE={{2003.07.10}};REPLYDATE={{2003-06-15 03:20}};CNT={{3}};

Память: 0.74 MBВремя: 0.377 c

www.delphimaster.net