﻿ SQL: Salesmen works either for one or more customer or not

# SQL Exercise: Salesmen works either for one or more customer or not

## SQL JOINS: Exercise-12 with Solution

Write a SQL statement to generate a list in ascending order of salespersons who work either for one or more customers or have not yet joined any of the customers.

Sample table: customer

Sample table: salesman

Sample Solution:

``````SELECT a.cust_name,a.city,a.grade,
b.name AS "Salesman", b.city
FROM customer a
RIGHT OUTER JOIN salesman b
ON b.salesman_id=a.salesman_id
ORDER BY b.salesman_id;
``````

Output of the Query:

```cust_name	city		grade	Salesman	city
Brad Davis	New York	200	James Hoog	New York
Nick Rimando	New York	100	James Hoog	New York
Graham Zusi	California	200	Nail Knite	Paris
Julian Green	London		300	Nail Knite	Paris
Geoff Cameron	Berlin		100	Lauson Hen	San Jose
Brad Guzan	London			Pit Alex	London
Fabian Johnson	Paris		300	Mc Lyon		Paris
Jozy Altidor	Moscow		200	Paul Adam	Rome
```

Explanation:

The said SQL query is performing a right outer join on the customer table alias a and the salesman table alias b on the 'salesman_id' column. It is then selecting the 'cust_name', 'city', and 'grade' columns from the customer table, and the 'name' and 'city' columns from the salesman table. The result is ordered by the 'salesman_id' column.
This query will select all the rows from the salesman table and any matching rows from the customer table and returning the results in the order of salesman_id. If there is no match, it will return NULL for the non-matching columns of customer table.

Visual Explanation:

## Query Visualization:

Duration:

Rows:

Cost:

Have another way to solve this solution? Contribute your code (and comments) through Disqus.

Previous SQL Exercise: Find customers who have placed no order or one or more.
Next SQL Exercise: Salesmen who works either for one or more customer.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.

﻿

## SQL: Tips of the Day

Grouped LIMIT in PostgreSQL: Show the first N rows for each group?

```db=# SELECT * FROM xxx;
id | section_id | name
----+------------+------
1 |          1 | A
2 |          1 | B
3 |          1 | C
4 |          1 | D
5 |          2 | E
6 |          2 | F
7 |          3 | G
8 |          2 | H
(8 rows)
```

I need the first 2 rows (ordered by name) for each section_id, i.e. a result similar to:

```id | section_id | name
----+------------+------
1 |          1 | A
2 |          1 | B
5 |          2 | E
6 |          2 | F
7 |          3 | G
(5 rows)
```

PostgreSQL v9.3 you can do a lateral join

```select distinct t_outer.section_id, t_top.id, t_top.name from t t_outer
join lateral (
select * from t t_inner
where t_inner.section_id = t_outer.section_id
order by t_inner.name
limit 2
) t_top on true
order by t_outer.section_id;
```

Database: PostgreSQL

Ref: https://bit.ly/3AfYwZI

We are closing our Disqus commenting system for some maintenanace issues. You may write to us at reach[at]yahoo[dot]com or visit us at Facebook