В этом руководстве вы узнаете, как использовать функцию 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 из примера базы данных:
Следующий запрос использует функцию 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() для получения знака числа.