Sql вычисляемые поля: SQL-Урок 6. Вычисляемые поля

SQL-Урок 6. Вычисляемые поля

ВВЕРХ


Для чего нужно использовать расчетные поля? Как правило, информация в БД представлена ??в разрезе отдельных фрагментов, поскольку так легче структурировать данные и оперировать ими. Однако нам часто будет нужно использовать не отдельные части данных, а уже соединенную и обработанную информацию. Например, часто необходимо сочетать имя и фамилию клиентов, сочетать элементы адресов, которые находятся в разных столбцах таблицы, обрабатывать текст и отдельные слова, буквы и символы, суммировать общую стоимость покупки, отображать статистику по информации, находящейся в БД. Данные обычно хранятся отдельными «кусками», что требует их дополнительной обработки на стороне клиентского приложения. Однако есть возможность получать уже обработанную информацию с помощью СУБД. Именно в этом случае помогают расчетные поля. Они автоматически создаются при выполнении запроса и имеют вид и свойства обычных столбцов, которые уже имеются в таблице. Единственное отличие заключается в том, что физически расчетных полей нет, поэтому они не занимают дополнительного места в БД, а временно существуют в «оперативной памяти» СУБД. Преимуществом выполнения операций на стороне СУБД является скорость обработки данных.

1. Выполнение математических операций

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

SELECT DISTINCT Product, Amount/Quantity FROM Sumproduct

Как видим, СУБД отобрала все наименования товаров и отобразила их среднюю стоимость в отдельном столбце, который был создан во время выполнения запроса. Также можно заметить, что мы использовали дополнительный оператор DISTINCT, который нам нужен для отображения уникальных названий товаров (без него мы бы получили дублирование записей).

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

В предыдущем примере мы рассчитывали среднюю стоимость покупки каждого товара и отобразили значение в расчетном столбце. Однако в дальнейшем, нам неудобно обращаться к этому полю, так как его название является неинформативным для нас (СУБД дала название полю — Expr1001 ). Однако мы можем назвать поле самостоятельно, заранее указав его название в запросе, то есть дать псевдоним. Давайте перепишем предыдущий пример и укажем псевдонима для расчетного поля:

SELECT DISTINCT Product, Amount/Quantity AS AvgPrice FROM Sumproduct

Видим, наше расчетное поле получило собственное название AvgPrice. Для этого мы использовали оператор AS, после которого указали необходимое нам название. Стоит отметить, что в SQL поддерживаются только основные математические операции: сложение (+), вычитание (-), умножение (*), деление (/). Также для изменения очередности выполнения операции можно использовать круглые скобки.

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

3. Соединение полей (конкатенация)

Кроме математических операций мы можем объединять текст и выводить его в отдельном поле. Давайте рассмотрим, каким образом можно осуществить склеивание (конкатенацию) текста. Имеем такой пример:

SELECT Month + ‘ ‘ + Product AS NewField, Quantity FROM Sumproduct

В этом примере мы соединили значение в двух столбцах и вывели результат в новое поле NewField.

Статьи по теме:

  • SQL-Урок 5. Использование метасимволов (LIKE)
  • SQL-Урок 7. Функции обработки данных
  • select — Как использовать вычисляемое значение в другом месте sql-запроса?


    Вопрос задан


    Изменён
    6 лет 9 месяцев назад


    Просмотрен
    1k раза

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

    declare @temp_table table (
        user_salary nvarchar(10)
        )
    insert into @temp_table (user_salary) values ('')
    insert into @temp_table (user_salary) values (NULL)
    insert into @temp_table (user_salary) values ('123')
    select (convert(float,isnull((case user_salary when '' then 0 
                                    else user_salary
                                    end),0))/2) as [prem]
    from @temp_table
    

    Возможно ли использование в дальнейшем данного вычисляемого значения или придется дублировать код?

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

    • sql
    • select






    3

    Вы можете заключить свой запрос еще в один select и на верхнем уровне вычисленные колонки будут доступны для любой работы с ними:

    select [prem], [prem]+...
      from (
        select user_salary, (convert(float,isnull((case user_salary when '' then 0 
                                    else user_salary
                                    end),0))/2) as [prem]
          from @temp_table
      ) A
    






    1

    Используйте SQL block. В нём возможно использование переменных и их подстановка в запросы.






    6

    вы можете объявить еще одну переменную, и присвоеть ей значение вашего выражение в запросе, и дальше работать с ней

    DECLARE @x float;
    select @x = (convert(float,isnull((case user_salary when '' then 0
    else user_salary
    end),0))/2) as [prem]
    from @temp_table






    2







    Зарегистрируйтесь или войдите

    Регистрация через Google

    Регистрация через Facebook

    Регистрация через почту

    Отправить без регистрации

    Почта

    Необходима, но никому не показывается

    Отправить без регистрации



    Почта

    Необходима, но никому не показывается




    By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.


    Вычисляемый столбец в SELECT SQL Query (MySQL)

    У меня есть следующий запрос:

     SELECT
    источник,
    Общее количество,
    Активкаунт
    ОТ
    (
        ВЫБРАТЬ COUNT(*) AS TotalCount, a.source
        ОТ стажировки
        СГРУППИРОВАТЬ ПО a.source
    ) КАК
    присоединиться
    (
        ВЫБРАТЬ COUNT (*) AS ActiveCount, b.source
        СО стажировки б
        ГДЕ b.int_lastdate > CURDATE() И b.status LIKE 'Опубликовано'
        СГРУППИРОВАТЬ ПО b.source
    ) АС Б
        ON A.источник = B.источник
     

    Приведенный выше запрос дает мне такой результат:

    Я хочу добавить сюда еще один столбец, который будет « ExpiredCount = TotalCount — ActiveCount »

    Как я могу это сделать?

    • mysql
    • sql

    Ответ Гордона, вероятно, то, что я хотел бы видеть в качестве администратора баз данных, наследующего чужой код. Но на самом деле мы могли бы вообще не использовать подзапрос и просто написать следующее:

     SELECT
        источник,
        COUNT(*) КАК TotalCount,
        SUM(CASE WHEN int_lastdate > CURDATE() AND status LIKE 'Published'
                 THEN 1 ELSE 0 END) AS ActiveCount,
        COUNT(*) - SUM(CASE WHEN int_lastdate > CURDATE() AND status LIKE 'Published'
                            THEN 1 ELSE 0 END) AS ExpiredCount
    СО стажировкой
    СГРУППИРОВАТЬ ПО источнику
     

    0

    Для этого вам просто нужно выражение. Однако вы можете упростить свой запрос:

     выберите i.source, i.TotalCount, i.ActiveCount,
           (i.TotalCount - i.ActiveCount) как ExpiredCount
    из (выберите i.source, count(*) как TotalCount, i.source,
                 сумма (i.int_lastdate > curdate() и i.status, например «Опубликовано») как ActiveCount
          со стажировки я
          группа по i.source
         ) я;
     

    Примечания:

    • Псевдонимы таблиц должны быть аббревиатурами имен таблиц, чтобы их было легко читать.
    • Для этого запроса не требуется объединение , достаточно условного агрегирования.
    • Чрезмерное использование обратных кавычек не является необходимым и усложняет написание запроса.
    • Ответ на ваш вопрос — простое выражение.

    EDIT:

    Если вы хотите использовать это как представление, вы не можете иметь подзапросы в предложении FROM (ограничение MySQL):

     выберите i.source, count(*) как TotalCount, i.source,
                 сумма (i. int_lastdate > curdate() и i.status, например «Опубликовано») как ActiveCount,
                 (количество (*) - сумма (i.int_lastdate > curdate () и i.status, например «Опубликовано»)) как ExpiredCount
          со стажировки я
          группа по i.source
     

    2

    Зарегистрируйтесь или войдите в систему

    Зарегистрируйтесь с помощью Google

    Зарегистрироваться через Facebook

    Зарегистрируйтесь, используя электронную почту и пароль

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

    MS SQL Server — использовать вычисляемое поле оператора SELECT

    спросил

    Изменено
    5 лет, 5 месяцев назад

    Просмотрено
    3к раз

    Я хотел бы спросить вас, есть ли оператор для использования вычисляемых полей того же оператора SELECT:

    Например:

    Табличный тест:

    Значение суммы машины
    500 20 20

     ВЫБЕРИТЕ машину,
        Сумма * Значение AS TestFormula
        ТестФормула*12 AS TestFormulaYear
    ОТ Тест
     

    Как правильно использовать это вычисляемое поле?

    Заранее спасибо,

    Кевин

    • sql-server
    • sql-server-2008

    0

    По крайней мере, на сервере sql вы можете сделать это с помощью подзапроса:

     SELECT Machine
    , ТестФормула
    , TestFormula*12 AS TestFormulaYear
    ОТ    (
               ВЫБЕРИТЕ машину
               , Сумма * Значение AS TestFormula
               ОТ Тест
            ) Т
     

    Для простого примера, который вы нам показали, я бы просто рекомендовал повторить выражение

     SELECT
        Машина,
        Сумма * Значение AS TestFormula,
        Сумма * Значение * 12 AS TestFormulaYear
    ИЗ Тест;
     

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

    Вы можете использовать выражение общей таблицы (CTE) для повторного использования значения:

     С формулой AS (
        ВЫБЕРИТЕ машину,
            Сумма * Значение AS TestFormula
        ОТ Тест
        )
    ВЫБЕРИТЕ машину,
        Формула Теста
        ТестФормула*12 AS TestFormulaYear
    ИЗ формулы;
     

    Если пакет с CTE содержит несколько операторов, предыдущий оператор должен заканчиваться точкой с запятой.

    Предполагая, что это T-SQL:

    Вы не можете ссылаться на псевдоним столбца в операторе SELECT , нет. Если вы посмотрите на SELECT (Transact-SQL), вы заметите, что SELECT — это восьмая часть обрабатываемого запроса. Это означает, что только ORDER BY сможет ссылаться на псевдоним столбца.

    Если вам нужно выполнить дальнейшие вычисления для вычисленного значения, вам нужно использовать CTE, подзапрос или повторно объявить вычисление. Например:

    Повторный расчет:

     SELECT [Столбец] * 10 Как выражение,
           [Столбец] * 10 * 5 AS Expression2
    ИЗ [Таблица];
     

    CTE:

     С формулой AS(
        SELECT [Столбец] * 10 как выражение
        ИЗ [Таблицы])
    ВЫБЕРИТЕ выражение,
           Выражение * 5 AS Выражение2
    ИЗ Формулы;
     

    Подзапрос:

     SELECT Выражение,
           Выражение * 5 AS Выражение2
    FROM (SELECT [столбец] * 10 как выражение
          ИЗ [Таблица]) Формула;
     

    Если вы хотите настроить оператор таким образом, чтобы при изменении формул многие столбцы обновлялись, я полагаю, вы могли бы объявить формулы и использовать динамический SQL.