Skip to content

Aggregate Functions in SQL Server

They take many rows and return ONE value.

COUNT -> how many
SUM   -> total
AVG   -> average
MIN   -> smallest
MAX   -> largest

This lesson creates its own small tables, so you can run it on any SQL Server database. The Output under each query is the real result.

IF DB_ID('SqlBasicsDb') IS NULL
    CREATE DATABASE SqlBasicsDb;
GO

USE SqlBasicsDb;
GO

DROP TABLE IF EXISTS Sales;
GO

CREATE TABLE Sales
(
    SaleID   INT PRIMARY KEY,
    Product  VARCHAR(30),
    Category VARCHAR(30),
    City     VARCHAR(30),
    Quantity INT,
    Price    INT
);

INSERT INTO Sales VALUES
(1,  'Pen',      'Stationery', 'Hyderabad', 10, 10),
(2,  'Pencil',   'Stationery', 'Chennai',   20, 5),
(3,  'Notebook', 'Stationery', 'Hyderabad', 5,  50),
(4,  'Mouse',    'Electronics','Mumbai',    2,  500),
(5,  'Keyboard', 'Electronics','Hyderabad', 1,  1200),
(6,  'Pen',      'Stationery', 'Mumbai',    15, 10),
(7,  'Monitor',  'Electronics','Chennai',   1,  9000),
(8,  'Chair',    'Furniture',  'Hyderabad', 2,  3000),
(9,  'Table',    'Furniture',  'Mumbai',    1,  5000),
(10, 'Mouse',    'Electronics','Chennai',   3,  NULL);   -- price not known
GO

SELECT * FROM Sales;
Messages
(10 rows affected)
Output
SaleIDProductCategoryCityQuantityPrice
1PenStationeryHyderabad1010
2PencilStationeryChennai205
3NotebookStationeryHyderabad550
4MouseElectronicsMumbai2500
5KeyboardElectronicsHyderabad11200
6PenStationeryMumbai1510
7MonitorElectronicsChennai19000
8ChairFurnitureHyderabad23000
9TableFurnitureMumbai15000
10MouseElectronicsChennai3NULL

COUNT(*) - count all rows

SELECT COUNT(*) AS TotalSales FROM Sales;
Output
TotalSales
10

COUNT(column) - counts only values that are NOT NULL

SELECT COUNT(Price) AS SalesWithPrice FROM Sales;       -- 9, because one Price is NULL
Output
SalesWithPrice
9

COUNT(DISTINCT column) - count unique values

SELECT COUNT(DISTINCT City) AS NumberOfCities FROM Sales;
Output
NumberOfCities
3

SUM - total

SELECT SUM(Quantity) AS TotalQuantity FROM Sales;
Output
TotalQuantity
60

AVG - average

SELECT AVG(Price) AS AveragePrice FROM Sales;            -- NULL is ignored
Output
AveragePrice
2086

MIN and MAX

SELECT MIN(Price) AS LowestPrice, MAX(Price) AS HighestPrice FROM Sales;
Output
LowestPriceHighestPrice
59000

All together in one query

SELECT COUNT(*)      AS TotalRows,
       SUM(Quantity) AS TotalQty,
       AVG(Price)    AS AvgPrice,
       MIN(Price)    AS MinPrice,
       MAX(Price)    AS MaxPrice
FROM Sales;
Output
TotalRowsTotalQtyAvgPriceMinPriceMaxPrice
1060208659000

Aggregate with WHERE (only Hyderabad)

SELECT SUM(Quantity) AS HyderabadQuantity
FROM Sales
WHERE City = 'Hyderabad';
Output
HyderabadQuantity
18

Aggregate on a calculation (total sales amount)

SELECT SUM(Quantity * Price) AS TotalAmount FROM Sales;
Output
TotalAmount
22800

MIN and MAX also work on text (alphabetical order)

SELECT MIN(Product) AS FirstProduct, MAX(Product) AS LastProduct FROM Sales;

-- =============================================
-- Remember
--   * Aggregate functions ignore NULL values (except COUNT(*)).
--   * To get totals PER group (per city, per category) use GROUP BY
--     - see 09_GroupBy_Having_OrderBy.sql
-- =============================================
Output
FirstProductLastProduct
ChairTable