w3resource

SQL Exercise: Customer who is neither in the list nor have a grade

SQL JOINS: Exercise-16 with Solution

Write a SQL statement to generate a report with the customer name, city, order no. order date, purchase amount for only those customers on the list who must have a grade and placed one or more orders or which order(s) have been placed by the customer who neither is on the list nor has a grade.

Sample table: customer


Sample table: orders


Sample Solution:

SELECT a.cust_name,a.city, b.ord_no,
b.ord_date,b.purch_amt AS "Order Amount" 
FROM customer a 
FULL OUTER JOIN orders b 
ON a.customer_id=b.customer_id 
WHERE a.grade IS NOT NULL;

Output of the Query:

cust_name	city		ord_no	ord_date	Order Amount
Brad Guzan	London		70009	2012-09-10	270.65
Nick Rimando	New York	70002	2012-10-05	65.26
Geoff Cameron	Berlin		70004	2012-08-17	110.50
Brad Davis	New York	70005	2012-07-27	2400.60
Nick Rimando	New York	70008	2012-09-10	5760.00
Fabian Johnson	Paris		70010	2012-10-10	1983.43
Geoff Cameron	Berlin		70003	2012-10-10	2480.40
Jozy Altidor	Moscow		70011	2012-08-17	75.29
Nick Rimando	New York	70013	2012-04-25	3045.60
Graham Zusi	California	70001	2012-10-05	150.50
Graham Zusi	California	70007	2012-09-10	948.50
Julian Green	London		70012	2012-06-27	250.45

Explanation:

The said SQL query that is joining two tables: customer alias a, and orders alias b. The query is using a FULL OUTER JOIN on customer and orders tables on the 'customer_id' column.
The query is then selecting several columns from each table: 'cust_name' and 'city' from customer table, 'ord_no', 'ord_date', and 'purch_amt' aliased as 'Order Amount' from orders table.
The FULL OUTER JOIN ensures that all rows from both the customer table and the orders table are included in the result set, with NULL values in the columns of the table that doesn't have any matching rows for a customer.
The query also filters the results based on the condition "a.grade IS NOT NULL", which means it will only return the rows where the grade of the customer is not null. This means that rows where the customer doesn't have any grade will not be included in the result set.

Visual Explanation:

Result of a report with customer name, city, order no. order date, purchase amount for only those customers in the list who must have a grade and placed one or more orders or which order(s) have been placed by the customer who are neither in the list not have a grade

N.B.: In certain instances not null is removed in table structure, so results may vary.

Practice Online


Query Visualization:

Duration:

Query visualization of Make a report with customer name, city, order no. order date, purchase amount for only those customers on the list who must have a grade and placed one or more orders or which order(s) have been placed by the customer who is neither in the list not have a grade - Duration

Rows:

Query visualization of Make a report with customer name, city, order no. order date, purchase amount for only those customers on the list who must have a grade and placed one or more orders or which order(s) have been placed by the customer who is neither in the list not have a grade - Rows

Cost:

Query visualization of Make a report with customer name, city, order no. order date, purchase amount for only those customers on the list who must have a grade and placed one or more orders or which order(s) have been placed by the customer who is neither in the list not have a grade - Cost

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

Previous SQL Exercise: One or more customers ordered from the existing list
Next SQL Exercise: Salesman will appear for all customer and vice versa.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Follow us on Facebook and Twitter for latest update.

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