This problem requires generating a sales report showing the number of units sold for each item category on each day of the week. The solution involves joining the Orders
and Items
tables, grouping the results by category, and then using conditional aggregation to count sales for each day.
Join Tables: We start by performing a RIGHT JOIN
between the Orders
and Items
tables using o.item_id = i.item_id
. This ensures that we include all item categories, even those with no sales.
Group by Category: We group the results using GROUP BY category
to aggregate sales data for each item category.
Conditional Aggregation: The core of the solution lies in conditional aggregation. For each day of the week, we use SUM(IF(DAYOFWEEK(order_date) = day, quantity, 0))
to calculate the total quantity sold. DAYOFWEEK()
returns a number representing the day of the week (1=Sunday, 2=Monday, ..., 7=Saturday). The IF
statement checks if the day of the week matches the target day; if it does, the quantity is added to the sum; otherwise, 0 is added. This is repeated for each day of the week.
Order Results: Finally, we order the results by category using ORDER BY category
.
SELECT
item_category AS category,
SUM(IF(DAYOFWEEK(order_date) = '2', quantity, 0)) AS Monday,
SUM(IF(DAYOFWEEK(order_date) = '3', quantity, 0)) AS Tuesday,
SUM(IF(DAYOFWEEK(order_date) = '4', quantity, 0)) AS Wednesday,
SUM(IF(DAYOFWEEK(order_date) = '5', quantity, 0)) AS Thursday,
SUM(IF(DAYOFWEEK(order_date) = '6', quantity, 0)) AS Friday,
SUM(IF(DAYOFWEEK(order_date) = '7', quantity, 0)) AS Saturday,
SUM(IF(DAYOFWEEK(order_date) = '1', quantity, 0)) AS Sunday
FROM
Orders AS o
RIGHT JOIN Items AS i ON o.item_id = i.item_id
GROUP BY category
ORDER BY category;
SELECT item_category AS category
: Selects the item category and renames it to category
.SUM(IF(DAYOFWEEK(order_date) = '2', quantity, 0)) AS Monday
: Calculates the sum of quantity
for orders on Mondays. The IF
condition checks if DAYOFWEEK(order_date)
is 2 (Monday). If true, quantity
is summed; otherwise, 0 is added. This is repeated for each day of the week.FROM Orders AS o RIGHT JOIN Items AS i ON o.item_id = i.item_id
: Performs a right join to combine data from the Orders
and Items
tables based on item_id
.GROUP BY category
: Groups the results by category
to aggregate sales for each category.ORDER BY category
: Orders the final results alphabetically by category.The time complexity of this SQL query is dominated by the RIGHT JOIN
operation and the GROUP BY
operation. In the worst case, the RIGHT JOIN
can take O(mn) time, where 'm' is the number of rows in Orders
and 'n' is the number of rows in Items
. The GROUP BY
operation typically has a time complexity of O(m log m) or O(m), where 'm' is the number of rows in the joined table, depending on the specific database implementation. Therefore, the overall time complexity is approximately O(mn) in the worst case. The conditional aggregation within the SUM()
functions adds a constant time factor for each day of the week, which doesn't significantly change the overall time complexity. However, in practice, optimized database systems can often perform these operations much faster than the theoretical worst-case complexity suggests.