Example 1
List each customer's ordered products as a single string
Each customer's products are sorted alphabetically within the group before being joined. Alice's two products become 'Keyboard, Mouse'; Bob's become 'Keyboard, Monitor'. Carol has a single product so no separator appears.
Engine-specific syntax
Setup
CREATE TABLE orders (id INT, customer VARCHAR(50), product VARCHAR(50));
INSERT INTO
orders (id, customer, product)
VALUES
(1, 'Alice', 'Keyboard'),
(2, 'Alice', 'Mouse'),
(3, 'Bob', 'Monitor'),
(4, 'Bob', 'Keyboard'),
(5, 'Carol', 'Mouse');SQL
SELECT
customer,
GROUP_CONCAT (
product
ORDER BY
product SEPARATOR ', '
) AS products
FROM
orders
GROUP BY
customer
ORDER BY
customer;| customer | products |
|---|---|
| Alice | Keyboard, Mouse |
| Bob | Keyboard, Monitor |
| Carol | Mouse |
Engine-specific syntax
Setup
CREATE TABLE orders (id INT, customer VARCHAR(50), product VARCHAR(50));
INSERT INTO
orders (id, customer, product)
VALUES
(1, 'Alice', 'Keyboard'),
(2, 'Alice', 'Mouse'),
(3, 'Bob', 'Monitor'),
(4, 'Bob', 'Keyboard'),
(5, 'Carol', 'Mouse');SQL
SELECT
customer,
STRING_AGG (product, ', ') WITHIN GROUP (
ORDER BY
product
) AS products
FROM
orders
GROUP BY
customer
ORDER BY
customer;| customer | products |
|---|---|
| Alice | Keyboard, Mouse |
| Bob | Keyboard, Monitor |
| Carol | Mouse |
Engine-specific syntax
Setup
CREATE TABLE orders (id INT, customer VARCHAR(50), product VARCHAR(50));
INSERT INTO
orders (id, customer, product)
VALUES
(1, 'Alice', 'Keyboard'),
(2, 'Alice', 'Mouse'),
(3, 'Bob', 'Monitor'),
(4, 'Bob', 'Keyboard'),
(5, 'Carol', 'Mouse');SQL
SELECT
customer,
STRING_AGG (
product,
', '
ORDER BY
product
) AS products
FROM
orders
GROUP BY
customer
ORDER BY
customer;| customer | products |
|---|---|
| Alice | Keyboard, Mouse |
| Bob | Keyboard, Monitor |
| Carol | Mouse |
Engine-specific syntax
Setup
CREATE TABLE orders (id INT, customer VARCHAR(50), product VARCHAR(50));
INSERT INTO
orders (id, customer, product)
VALUES
(1, 'Alice', 'Keyboard'),
(2, 'Alice', 'Mouse'),
(3, 'Bob', 'Monitor'),
(4, 'Bob', 'Keyboard'),
(5, 'Carol', 'Mouse');SQL
SELECT
customer,
GROUP_CONCAT (product, ', ') AS products
FROM
(
SELECT
customer,
product
FROM
orders
ORDER BY
customer,
product
) sub
GROUP BY
customer
ORDER BY
customer;| customer | products |
|---|---|
| Alice | Keyboard, Mouse |
| Bob | Keyboard, Monitor |
| Carol | Mouse |
MySQL and MariaDB use GROUP_CONCAT; PostgreSQL and SQL Server use STRING_AGG. Results are identical.