Imagine I have the following 3 tables in SqlServer:
Customer (CustomerID, FirstName, LastName) Address (AddressID, CustomerID, Line1, City, State) Product (ProductID, CustomerID, Description)
A customer can have multiple delivery addresses and mulitple products.
What I would like to do is to list the number of customers for each State where the State is determined by the most recent Address record. Such as "How many customers last received a product in each State?". Therefore I'm not interested in any previous Address records for the Customer, only the most Recent (determined by AddressID).
State | Number of Customers -------------------------- CA | 32 GA | 12 TX | 0 OH | 18
I would normally do something like:
SELECT a.State, count(c.CustomerID) FROM Product p INNER JOIN Customer c ON c.CustomerID = p.CustomerID LEFT JOIN Address a ON a.CustomerID = c.CustomerID WHERE p.ProductID = 101 GROUP BY a.State
However, as a Customer may have multiple Addresses will the customer only be counted in the State of the most recent Address record?
P.S. The above is purely an example scenario to easily explain the joins I am trying to achieve and does not reflect an actual system design.
Here is the syntax that we can use to get the latest date records in SQL Server. Select column_name, .. From table_name Order By date_column Desc; Now, let's use the given syntax to select the last 10 records from our sample table.
To select the last row, we can use ORDER BY clause with desc (descending) property and Limit 1. Let us first create a table and insert some records with the help of insert command.
A left outer join is a method of combining tables. The result includes unmatched rows from only the table that is specified before the LEFT OUTER JOIN clause. If you are joining two tables and want the result set to include unmatched rows from only one table, use a LEFT OUTER JOIN clause or a RIGHT OUTER JOIN clause.
Different Types of SQL JOINs Here are the different types of the JOINs in SQL: (INNER) JOIN : Returns records that have matching values in both tables. LEFT (OUTER) JOIN : Returns all records from the left table, and the matched records from the right table.
Try this:
SELECT a.State, count(c.CustomerID) FROM Product p INNER JOIN Customer c ON c.CustomerID = p.CustomerID LEFT JOIN Address a ON a.CustomerID = c.CustomerID AND a.AddressID = ( SELECT MAX(AddressID) FROM Address z WHERE z.CustomerID = a.CustomerID ) WHERE p.ProductID = 101 GROUP BY a.State
You could also try (assuming I remember my SQLServer syntax correctly):
SELECT state, count(customer_id) FROM ( SELECT p.customer_id , (SELECT TOP 1 State FROM Address WHERE Address.CustomerID = p.CustomerID ORDER BY Address.ID DESC) state FROM Product p WHERE p.ProductID = 101) GROUP BY state
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With