Sample dataset · CC0
A year of pizza orders, rush hours included.
Order lines from one invented pizza shop across 2025: twelve pizzas, four sizes, three ways to order and a timestamp on every ticket. Friday dinner is busy and Tuesday afternoon is not. Every line total is quantity times a menu price that never changes, so your totals can be checked.
10 columns · 100 or 1,000 rows as a file · up to 1,000,000 rows generated here · CSV, JSON, JSONL, Excel, Parquet
Download the pizza sales data
Most people take the Excel file or the 1,000-row CSV. That file holds 556 orders and $17,998.50 of sales, enough for every weekday and every hour the shop is open to have a real total. The 100-row file is 59 orders spread across the whole year: fine for testing a formula, too thin for a chart.
| Format | Small | Standard |
|---|---|---|
| CSV | 100 rows (6.9 KB) | 1,000 rows (67.9 KB) |
| JSON | 100 rows (19.3 KB) | 1,000 rows (192.8 KB) |
| JSONL | 100 rows (19.0 KB) | 1,000 rows (189.9 KB) |
| Excel | 100 rows (20.5 KB) | 1,000 rows (128.9 KB) |
| Parquet | 100 rows (3.7 KB) | 1,000 rows (14.5 KB) |
Need more orders?
At 100,000 rows the shop takes about 57,000 orders, roughly 156 a day, which is what a busy single site actually does. A million rows is 571,000 orders and a 68 MB CSV. Excel will still open it (its limit is 1,048,576 rows), slowly, and it gives Power BI something heavier than a classroom file.
The first eight rows
The first eight rows of the 1,000-row file. Order 1002 has three lines: three different pizzas on one ticket, sharing a time and a channel. Order 1003 is two XL Paneer Tikkas on a single line, so quantity is 2 and the line total is $46.00.
| order_id | order_date | order_time | pizza_name | category | size | quantity | unit_price | line_total | channel |
|---|---|---|---|---|---|---|---|---|---|
| 1001 | 2025-01-01 | 12:42:37 | Tandoori Chicken | Chicken | S | 1 | 13.00 | 13.00 | Takeaway |
| 1002 | 2025-01-02 | 12:33:04 | Tandoori Chicken | Chicken | XL | 1 | 24.00 | 24.00 | Dine-in |
| 1002 | 2025-01-02 | 12:33:04 | BBQ Chicken | Chicken | S | 1 | 12.50 | 12.50 | Dine-in |
| 1002 | 2025-01-02 | 12:33:04 | Four Cheese | Veggie | M | 1 | 15.00 | 15.00 | Dine-in |
| 1003 | 2025-01-02 | 18:41:42 | Paneer Tikka | Veggie | XL | 2 | 23.00 | 46.00 | Delivery |
| 1004 | 2025-01-02 | 21:00:55 | Margherita | Classic | M | 1 | 12.50 | 12.50 | Dine-in |
| 1005 | 2025-01-03 | 18:13:03 | Meat Feast | Supreme | XL | 1 | 25.00 | 25.00 | Delivery |
| 1005 | 2025-01-03 | 18:13:03 | Pepperoni | Classic | M | 1 | 14.00 | 14.00 | Delivery |
Ten columns, and what each one holds
| Column | Type | What it holds | Example |
|---|---|---|---|
| order_id | integer | Order number, 1001 upward. An order can span several lines, one per pizza and size. | 1001 |
| order_date | date | Date the order was placed, 2025-01-01 to 2025-12-31, ascending through the file. | 2025-01-01 |
| order_time | text | Time the order was placed, 24-hour HH:MM:SS. The shop takes orders from 11:00 to 23:00. | 12:42:37 |
| pizza_name | text | One of twelve pizzas, some far more popular than others. | Tandoori Chicken |
| category | text | Classic, Veggie, Chicken or Supreme. Fixed per pizza. | Chicken |
| size | text | S, M, L or XL. | S |
| quantity | integer | How many of that pizza in that size, usually 1. | 1 |
| unit_price | decimal | Menu price in USD for that pizza in that size. The menu never changes during the year. | 13.00 |
| line_total | decimal | quantity times unit_price. Summed by order_id it gives the order value. | 13.00 |
| channel | text | Dine-in, Takeaway or Delivery, fixed per order. Delivery takes over in the evening. | Takeaway |
Practice questions to try
- Which day of the week brings in the most revenue, and which the least? In the 1,000-row file: Friday with $3,358.00, Tuesday with $1,963.00.
- Which pizza size brings in the most revenue on Fridays? Large, with $1,324.00 of Friday's $3,358.00.
- What is the average order value? Averaging line_total gives the wrong answer; add up each order_id first. $32.37 across 556 orders. The average line is $18.00.
- Which three pizzas sell the most units, and which sells the fewest? Pepperoni (185), Margherita (151) and BBQ Chicken (140). Mushroom and Truffle sells 30.
- At what hour does the shop take the most orders? 18:00, with 72. Noon is close behind with 69, and 15:00 is the quietest hour with 17.
- How much of the business is delivery at lunch, and how much at dinner? About 25% of orders placed before 15:00, and 58% of orders placed from 17:00 on.
- What was the busiest day of the year, and which two dates have no orders at all? Sunday 9 February, Super Bowl day, with 8 orders. Nothing on 27 November or 25 December.
- What share of revenue does each category bring? Classic 33.6%, Chicken 26.3%, Veggie 24.5%, Supreme 15.6%.
Most of these can be answered in the dashboard view without writing a formula, which is a good way to check the formula you did write.
One row is one pizza on one order
This is a till export, not a summary. Each row is a line on a ticket: which pizza, what size, how many, at what price. An order with three different pizzas takes three rows, and those rows share an order_id, a date, a time and a channel. Two of the same pizza in the same size go on one line with quantity 2, the way a real till merges them, so no order ever lists the same pizza and size twice.
That is the detail most first attempts at this kind of file get wrong. Count the rows and you have counted lines, not orders. Average line_total and you get $18.00, which is the price of a typical pizza rather than a typical order. Group by order_id first and the average order is $32.37. If your dashboard shows a number of orders, check whether it is 1,000 or 556.
The menu is fixed for the whole year. Medium prices run from $12.50 for a Margherita to $18.00 for the Mushroom and Truffle. Small is $3.50 less than medium, large is $4.00 more and extra large is $7.50 more, so a large Pepperoni is always $18.00 and averaging unit_price for one pizza and size returns the menu price exactly.
The patterns built into it
Orders do not land evenly across the calendar. Friday takes about 1.7 times as many orders as Monday, Saturday is close behind, and Monday and Tuesday are the quiet days. Winter months run a little ahead of July and August. On 9 February, Super Bowl Sunday, the shop does about three times a normal day's trade. It is shut on Thanksgiving and on Christmas Day, so those two dates have no rows at any size.
The clock follows a real shop too. Orders start at 11:00, climb to a lunch peak at noon, sag through the afternoon and peak again between 18:00 and 20:00. Weekend lunch runs a little longer than weekday lunch. Dine-in and takeaway carry lunch; after 17:00 more than half of all orders are deliveries.
Popularity is uneven on purpose. Pepperoni, Margherita and BBQ Chicken sell the most, and the Mushroom and Truffle, the most expensive pizza on the menu, sells the least. A bar chart of units by pizza should have a clear slope, which is what makes "best and worst sellers" a question with an answer.
Working with it in Excel, Power BI or SQL
Open the CSV in Excel and the date and time columns arrive as real dates and times. =TEXT(B2,"dddd") gives the weekday name and =HOUR(C2) gives the hour, and both are worth adding as columns before you build the pivot. The .xlsx download stores those two columns as text, exactly as the CSV writes them, so wrap them in DATEVALUE and TIMEVALUE first if a formula refuses them.
In Power BI, the measure people usually need first is average order value. With the table loaded as Sales, that is DIVIDE(SUM(Sales[line_total]), DISTINCTCOUNT(Sales[order_id])). Getting that right, rather than AVERAGE(line_total), is the point of the exercise. In SQL it is the same idea in two steps: sum line_total GROUP BY order_id in a subquery, then take the average of that.
The Parquet file stores order_time as a real TIME column and order_date as a DATE, so a query engine can extract the hour without any parsing. In JSON, order_time is a string like "18:41:42", because JSON has no time type.
What people use it for
- A first Power BI or Tableau dashboard: revenue by day, by hour, by size and by pizza.
- Excel pivot tables, plus the weekday and hour formulas that feed them.
- Learning the difference between a line and an order, which is where most average order value mistakes come from.
- SQL practice with GROUP BY, COUNT(DISTINCT order_id) and date functions.
- Time-of-day charts with a lunch peak, a dinner peak and a dead afternoon in between.
Open it somewhere useful
Each link opens the 1,000-row file in that tool straight away. If the assignment says "by weekday", start with the pivot table. If it says "trend", start with the chart.
License, and the people in it
This dataset is dedicated to the public domain under CC0 1.0. Put it in a course, a paid product, a test suite, a bug report, a screenshot, a conference talk or a book. There is nothing to ask for, nothing to sign and no attribution required. A link back is welcome and is not a condition.
There are no people in this file. No customer names, no addresses, no phone numbers: an order is a number, a time and some pizza. The shop is invented as well, so nothing here can identify anyone or embarrass a real business.
Questions people ask about this file
Is this the same pizza dataset my course uses?
Probably not, though it has the same shape: one row per pizza on an order, with a date and a time. That shape is what most Excel and Power BI courses teach with. The pizzas, prices and patterns here are our own, made by a seeded generator, and the file is CC0, so you can publish a dashboard or a portfolio project built on it without asking anyone.
Why does order_id repeat?
Because a row is a line, not an order. An order with three different pizzas takes three rows, all with the same order_id, date, time and channel. To count orders use a distinct count of order_id; to get an order's value, sum line_total by order_id. The 1,000-row file has 1,000 lines and 556 orders.
Why is order_time text in some formats?
CSV has no types at all, and JSON has no time type, so in both the time is written as HH:MM:SS. Excel and Power BI recognise it as a time when they import the CSV. The Parquet file stores it as a real TIME column. If a tool leaves it as text, the first two characters are the hour.
Are the prices in dollars?
Yes, US dollars, and the menu does not change during the year. If your course works in rupees or euros, multiply unit_price and line_total by the same rate and every total still reconciles, because line_total is always quantity times unit_price.
Can I use it for a college project or a portfolio?
Yes. It is CC0 1.0, a public domain dedication, so there is nothing to sign and no attribution required. Put it in coursework, a public dashboard, a blog post or a paid course. A link back is welcome and is not a condition.
More sample data
All twenty-four datasets · Messy files and every other format · Build your own schema