Definition:
  

The GROUP BY clause groups together rows with similar values into summary rows, which allows for tasks such as counting the number of customers in each country. This clause is frequently used in combination with aggregate functions (COUNT(), MAX(), MIN(), SUM(), AVG()) to group the result set based on one or more columns. 

Syntax: 
SELECT Column_Name 
FROM Table_Name 
GROUP BY Column_Name
 

Tables used in below examples  

1.Table1 

CREATE TABLE Customers ( 
                          ID INT PRIMARY KEY, 
                         Name VARCHAR(50) NOT NULL, 
                         Email VARCHAR(50) NOT NULL  
                       ); 

INSERT INTO Customers(
ID,
Name,
Email) 
VALUES  
  (1, ‘Alice’, ‘alice@gmail.com’), 
  (2, ‘Bob’, ‘bob@gmail.com’), 
  (3, ‘Charlie’, ‘charlie@gmail.com’); 

Overview of table

SELECT *
FROM Customers

2.Table2 

CREATE TABLE OrderDetails ( 
                             ID INT PRIMARY KEY, 
                             Customer_id INT, 
                            Product VARCHAR(50),  
                            Quantity INT 
                          ); 

INSERT INTO  OrderDetails(
ID,
Customer_id,
Product, Quantity
) 
VALUES  
(1, 1, ‘Apple’, 2), 
  (2, 1, ‘Banana’, 3), 
  (3, 2, ‘Orange’, 1), 
  (4, 2, ‘Apple’, 5), 
  (5, 3, ‘Banana’, 2), 
  (6, 3, ‘Apple’, 1); 

Overview of table

SELECT *
FROM OrderDetails

Examples:  

Level1:- Join With Group By 

SELECT  
       Customers.Name,  
       SUM(OrderDetails.quantity) AS Total_Quantity 
FROM  
       dbo.Customers 
JOIN 
       dbo.OrderDetails 
ON  
       Customers.ID = OrderDetails.Customer_Id 
GROUP BY  
       Customers.Name; 

Result : 

Level2:- Join With Group By & OrderBy 

SELECT  
       Customers.Name,  
       SUM(OrderDetails.quantity) AS total_Quantity 
FROM  
       dbo.Customers 
JOIN  
       dbo.OrderDetails 
ON  
       Customers.ID = OrderDetails.customer_Id 
GROUP BY 
       Customers.Name 
ORDER BY  
       Total_Quantity asc; 

Result : 

Level3:- Join With Where clause, Group By & OrderBy 

SELECT  
      Customers.Name, 
      SUM(OrderDetails.quantity) AS Total_Quantity,          
      OrderDetails.Product 
FROM  
      dbo.Customers 
JOIN  
      dbo.OrderDetails 
ON  
      Customers.ID = OrderDetails.customer_id 
WHERE Product = ‘Apple’  
GROUP BY Customers.name, OrderDetails.Product 
ORDER BY Customers.Name asc; 

Result : 

Level4:- Join With Where clause, Group By, Having  & OrderBy 

SELECT  
      Customers.Name,  
      SUM(OrderDetails.quantity)AS Total_Quantity, 
      OrderDetails.Product 
FROM  
      dbo.Customers 
JOIN  
      dbo.OrderDetails 
ON Customers.ID = OrderDetails.customer_id 
WHERE Product = ‘Apple’  
GROUP BY Customers.name, OrderDetails.Product 
HAVING SUM(OrderDetails.quantity) > 1 
ORDER BY Customers.Name asc; 

Result :