PostgreSQL: Combining columns using math operators

Updated: January 5, 2024 By: Guest Contributor Post a comment

Introduction

Working with databases often involves performing calculations on multiple columns. In PostgreSQL, combining columns using mathematical operators allows for complex data transformations and analyses within your queries. This article will explore how to use these operators through a series of concise examples.

Basic Mathematical Operations

In PostgreSQL, you can perform basic mathematical operations such as addition (+), subtraction (-), multiplication (*), and division (/) on numeric fields. Here are some examples:

SELECT price + tax AS total_cost FROM orders;

SELECT weight * 2.20462 AS weight_lbs FROM products;

SELECT revenue / NULLIF(items_sold, 0) AS average_price FROM sales;

These statements demonstrate simple math operations where you add tax to the price, convert weight to pounds, and calculate an average price, catering for division by zero using the NULLIF function.

Combining Multiple Columns

To combine multiple columns, you simply extend the calculation to involve more fields:

SELECT item1_price + item2_price + item3_price AS total_price FROM order_items;

SELECT salary - (federal_tax + state_tax) AS net_income FROM employees;

SELECT (length * width * height) / 1728 AS cubic_feet FROM shipments;

Working with Different Data Types

Sometimes, combining columns requires data type conversions, particularly when dealing with numbers and text:

SELECT name || CAST(price AS varchar) AS product_label FROM products; SELECT 'The total for ' || username || ' is ' || CAST(total_price AS varchar) || '.' AS user_total FROM orders; 

Here, the CAST function converts the numeric price to a string so it can concatenate with other text data.

Advanced Calculations

In more complex scenarios, you might need to include functional calls or case-based logic in your calculations:

SELECT id, name, ROUND((height_cm / 100.0)::numeric, 2) AS height_m FROM athletes;

SELECT COALESCE(commission * total_sales, 0) AS total_commission FROM employees;

SELECT hours_worked * COALESCE(rate, DEFAULT_RATE) AS total_pay FROM timesheets;

These examples demonstrate rounding values, handling nulls with COALESCE, and providing a default rate if the rate is null.

Window Functions and Aggregates

PostgreSQL also supports window functions and aggregates that can be useful when combining columnar data over a set of rows:

SELECT customer_id, order_id, total_price, SUM(total_price) OVER (PARTITION BY customer_id) AS customer_total FROM orders;

SELECT product_id, sale_date, daily_sales, AVG(daily_sales) OVER (ORDER BY sale_date RANGE BETWEEN INTERVAL '1 day' PRECEDING AND CURRENT ROW) AS moving_average FROM daily_product_sales;

These examples calculate total sales per customer and a moving average of daily sales per product.

Performance Considerations

When combining columns with mathematical operations, indexes and query planning can significantly affect performance. Ensure that operations don’t impede the planner’s ability to use indexes effectively.

Using Math Operators in Joins and Subqueries

Mathematical operators also play a crucial role in forming conditions for joins and crafting subqueries:

SELECT p.name, p.price, s.discount FROM products p
JOIN sales s ON p.id = s.product_id AND p.price > s.discount;

WITH summarized_sales AS (
SELECT product_id, SUM(quantity * unit_price) AS total_sales FROM order_items GROUP BY product_id
) SELECT * FROM summarized_sales WHERE total_sales > 10000;

These queries show how to join tables using conditions involving math and how to use subqueries with calculated totals.

Functional Programming and Set Operations

On top of direct column operations, PostgreSQL supports set-based and functional programming approaches for handling complex calculations:

SELECT UNNEST(ARRAY[width, depth, height]) AS dimensions, product_id FROM products;

SELECT product_id, STRING_AGG(feature, ', ') FROM product_features GROUP BY product_id;

These examples make use of array manipulation and string aggregation across groups.

Conclusion

We’ve explored various ways to combine columns in PostgreSQL using mathematical operators, from simple arithmetic to more sophisticated window functions and subqueries. Effective use of these techniques can lead to efficient and versatile queries that handle complex data transformations with ease.