- SQL Chips and Chunks Newsletter
- Posts
- Week 14 - SQL Chips and Chunks Newsletter
Week 14 - SQL Chips and Chunks Newsletter
1. SQL Chip: Understanding GROUP BY
and HAVING
for WDBMS Stock Analysis
Clear and concise takeaway: In a WDBMS, you often need to summarize inventory data (like total quantities or average stock levels) by different categories (e.g., product type, supplier, location).
GROUP BY
is your primary tool for this aggregation. It collapses rows into summary rows based on the values in one or more columns. Once you've grouped your data,HAVING
acts like aWHERE
clause but for groups. It allows you to filter these aggregated results, showing you only the groups that meet specific criteria (e.g., locations with total stock below a certain threshold).
2. SQL Chunk: Aggregating WDBMS Inventory by Location
Let's start by understanding total stock per location within our WDBMS. For this example, we assume we have pre-existing tables: products
, warehouse_stock
, and locations
.
-- Assume the following WDBMS tables exist with data:
-- products (product_id, product_name, category, supplier_id)
-- warehouse_stock (stock_id, product_id, location_id, quantity, last_updated)
-- locations (location_id, location_name)
-- The core WDBMS query: Calculate total quantity per location
SELECT
L.location_name,
SUM(WS.quantity) AS total_stock_quantity
FROM
warehouse_stock AS WS
JOIN
locations AS L ON WS.location_id = L.location_id
GROUP BY
L.location_name
ORDER BY
total_stock_quantity DESC;
What this WDBMS query does: This DQL query combines information from warehouse_stock
(our inventory) and locations
(where items are stored) using an INNER JOIN
. It then uses GROUP BY
to sum up the quantity
of all items for each location_name
, giving us a clear picture of stock distribution across our WDBMS. The ORDER BY
clause neatly arranges the results from the highest total stock to the lowest.
3. SQL Challenge: Identifying Understocked or Overstocked WDBMS Locations using HAVING
Now, let's take our WDBMS insights further. We want to identify specific locations that might be understocked (e.g., total stock less than 100 units) or overstocked (total stock greater than 150 units). This is where HAVING
comes into play, filtering groups based on their aggregated values. We will continue to use our assumed products
, warehouse_stock
, and locations
tables.
-- Assume pre-existing WDBMS tables: products, warehouse_stock, locations
SELECT
L.location_name,
SUM(WS.quantity) AS total_stock_quantity
FROM
warehouse_stock AS WS
JOIN
locations AS L ON WS.location_id = L.location_id
GROUP BY
L.location_name
HAVING
SUM(WS.quantity) < 100 OR SUM(WS.quantity) > 150
ORDER BY
total_stock_quantity;
Why this WDBMS query is a step up: This DQL query first calculates the total_stock_quantity
for each location, just like before. However, the HAVING
clause then filters these grouped results. It only includes locations where the calculated total_stock_quantity
is less than 100 OR greater than 150. This is powerful for quickly pinpointing locations in your WDBMS that need attention for inventory management.
4. SQL Mistake: Misusing WHERE
vs. HAVING
in WDBMS Queries
A common mistake in WDBMS queries, especially for beginners, is confusing WHERE
and HAVING
.
The Mistake: Trying to filter aggregated results (like
SUM(quantity)
) using aWHERE
clause.-- INCORRECT WDBMS QUERY EXAMPLE: -- Assume pre-existing WDBMS tables: products, warehouse_stock, locations SELECT L.location_name, SUM(WS.quantity) AS total_stock_quantity FROM warehouse_stock AS WS JOIN locations AS L ON WS.location_id = L.location_id WHERE SUM(WS.quantity) < 100 -- THIS WILL CAUSE AN ERROR! GROUP BY L.location_name;
Why it's a mistake:
WHERE
filters individual rows before they are grouped and aggregated.SUM(WS.quantity)
is an aggregated value, meaning it only exists afterGROUP BY
has done its job. You can't filter on an aggregate before it's calculated.The Fix: Always use
HAVING
to filter results based on aggregate functions.HAVING
operates on the results of theGROUP BY
clause. That's it - just changeWHERE
toHAVING
and the query will work correctly for this particular example.
5. SQL Practice: Prioritizing WDBMS Locations for Restocking
You are a logistics manager for a large WDBMS. You need to identify the top 3 locations that currently hold the lowest total quantity of Electronics products. This information will help you prioritize which locations need immediate restocking.
Your task: Write a SQL query to achieve this using only DQL. You'll need to combine JOIN
, WHERE
(for filtering by product category), GROUP BY
, ORDER BY
, and then use a Common Table Expression (CTE) with ROW_NUMBER()
or RANK()
to select the top locations.
-- Assume pre-existing WDBMS tables: products, warehouse_stock, locations
-- We want to find the top 3 locations with the LOWEST total quantity of 'Electronics' products.
WITH ElectronicsStock AS (
SELECT
L.location_name,
SUM(WS.quantity) AS total_electronics_stock
FROM
warehouse_stock AS WS
JOIN
products AS P ON WS.product_id = P.product_id
JOIN
locations AS L ON WS.location_id = L.location_id
WHERE
P.category = 'Electronics' -- Filter for 'Electronics' products BEFORE grouping
GROUP BY
L.location_name
),
RankedElectronicsStock AS (
SELECT
location_name,
total_electronics_stock,
ROW_NUMBER() OVER (ORDER BY total_electronics_stock ASC) as rn -- Rank by lowest stock first
FROM
ElectronicsStock
)
SELECT
location_name,
total_electronics_stock
FROM
RankedElectronicsStock
WHERE
rn <= 3;
6. SQL Resource: DataCamp - Introduction to SQL
Name: DataCamp - Introduction to SQL
Link:
https://www.datacamp.com/courses/introduction-to-sql
Description: DataCamp offers an interactive and highly practical online learning experience. Their "Introduction to SQL" course is fantastic for beginners because it provides hands-on coding exercises directly in your browser. This means you can immediately apply the concepts of
SELECT
,FROM
,JOIN
,GROUP BY
,WHERE
, andHAVING
that we've discussed for WDBMS insights. The course structure, with bite-sized lessons and immediate feedback on your queries, makes learning engaging and helps solidify your understanding of how these DQL clauses work together in real-world scenarios. It's a great next step to deepen your practical SQL skills.