Функция SQL Server SIGN()

В этом руководстве вы узнаете, как использовать функцию SQL Server SIGN() для получения знака числа.

Синтаксис функции SQL Server SIGN

В SQL Server функция SIGN() позволяет получить знак числа, который может быть отрицательным, положительным или нулевым.

Вот синтаксис функции SIGN():

SIGN(numeric_expression)

В этом синтаксисе числовое_выражение — это число или числовое выражение, знак которого требуется получить.

Функция SIGN() возвращает 1, если значение положительное, -1, если значение отрицательное, или 0, если значение равно нулю.

Функция вернет NULL, если numeric_expression равно NULL.

Примеры функции SQL Server SIGN()

Давайте рассмотрим несколько примеров использования функции SIGN().

1) Пример базовой функции SIGN()

В следующем примере функция SIGN() используется для получения знака чисел -10, 0 и 10:

SELECT
  SIGN(-10) s1,
  SIGN(0)   s2,
  SIGN(10)  s3;

Выход:

s1 | s2 | s3
---+----+----
-1 | 0  | 1

2) Использование функции SIGN() с табличными данными

Мы будем использовать таблицы sales.orders и sales.order_items из примера базы данных:

Функция SQL Server SIGN() — Примеры таблиц

Следующий запрос использует функцию SIGN() для создания тенденций продаж на основе знаков отклонений продаж между годом и предыдущим годом:

WITH
  sales_summary(year, amount) AS(
    SELECT
      YEAR(order_date) year,
      SUM(quantity * list_price *(1 - discount)) amount
    FROM
      sales.orders o
      INNER JOIN sales.order_items i ON i.order_id = o.order_id
    GROUP BY
      YEAR(order_date)
  ),
  sales_comparison(year, amount, py_sales) AS(
    SELECT
      year,
      amount,
      LAG(amount) OVER( ORDER BY year) AS py_sales
    FROM
      sales_summary
  )
SELECT
  year,
  amount,
  py_sales,
  CASE
    WHEN py_sales IS NULL THEN 'N/A'
    WHEN sign(amount - py_sales) = 1 THEN 'Up'
    WHEN sign(amount - py_sales) = -1 THEN 'Down'
    ELSE 'Unchanged'
  END AS sales_variances
FROM
  sales_comparison;

Выход:

year | amount       | py_sales     | sales_variances
-----+--------------+--------------+----------------
2016 | 2427378.5276 | None         | N/A
2017 | 3447208.2425 | 2427378.5276 | Up
2018 | 1814529.7875 | 3447208.2425 | Down

Как это работает.

Сначала создайте общее табличное выражение(CTE) с именем sales_summary, которое возвращает общий объем продаж по годам:

SELECT
  YEAR(order_date) year,
  SUM(quantity * list_price *(1 - discount)) amount
FROM
  sales.orders o
  INNER JOIN sales.order_items i ON i.order_id = o.order_id
GROUP BY
  YEAR(order_date)

Во-вторых, создайте еще одно CTE с именем sales_comparison, которое включает предыдущие продажи(py_sales), используя оконную функцию LAG() :

SELECT
  YEAR,
  amount,
  LAG(amount) OVER( ORDER BY year) AS py_sales
FROM
  sales_summary

В-третьих, классифицируйте отклонения продаж как «Вверх», если продажи текущего года выше, «Вниз», если они ниже, и «Не изменились», если они такие же, как в предыдущем году:

SELECT
  year,
  amount,
  py_sales,
  CASE
    WHEN py_sales IS NULL THEN 'N/A'
    WHEN sign(amount - py_sales) = 1 THEN 'Up'
    WHEN sign(amount - py_sales) = -1 THEN 'Down'
    ELSE 'Unchanged'
  END AS sales_variances
FROM
  sales_comparison;

Краткое содержание

  • Используйте функцию SIGN() для получения знака числа.
Мирослав С.

Автор статей, ИБ-специалист