Developer ToolsFree generatorPDF, Excel, Word exportAerospace MRO

MRO Open Work Order Aging SQL Query Generator

Open work orders that sit untouched are a quiet cost in a repair station: parts wait, customers chase and turn times stretch. This generator writes a SQL aging query that you can point at your own work order table.

Fill in

Replace with your actual table or view name.

Quoted and comma separated.

Generated code
Download:

Aging summary by station (SQL Server style)

SELECT
  station,
  COUNT(*) AS open_work_orders,
  SUM(CASE WHEN DATEDIFF(day, open_date, GETDATE()) <= 7 THEN 1 ELSE 0 END) AS age_0_to_7,
  SUM(CASE WHEN DATEDIFF(day, open_date, GETDATE()) > 7 AND DATEDIFF(day, open_date, GETDATE()) <= 30 THEN 1 ELSE 0 END) AS age_7_to_30,
  SUM(CASE WHEN DATEDIFF(day, open_date, GETDATE()) > 30 AND DATEDIFF(day, open_date, GETDATE()) <= 90 THEN 1 ELSE 0 END) AS age_30_to_90,
  SUM(CASE WHEN DATEDIFF(day, open_date, GETDATE()) > 90 THEN 1 ELSE 0 END) AS age_over_90
FROM work_orders
WHERE status NOT IN ('CLOSED','CANCELLED')
GROUP BY station
ORDER BY open_work_orders DESC;

Oldest open work orders (detail list)

SELECT TOP 50
  wo_number,
  station,
  status,
  open_date,
  DATEDIFF(day, open_date, GETDATE()) AS age_days
FROM work_orders
WHERE status NOT IN ('CLOSED','CANCELLED')
ORDER BY age_days DESC;

Same detail list for PostgreSQL or Oracle

-- PostgreSQL
SELECT wo_number, station, status, open_date,
       (CURRENT_DATE - open_date::date) AS age_days
FROM work_orders
WHERE status NOT IN ('CLOSED','CANCELLED')
ORDER BY age_days DESC
LIMIT 50;

-- Oracle
SELECT wo_number, station, status, open_date,
       TRUNC(SYSDATE - open_date) AS age_days
FROM work_orders
WHERE status NOT IN ('CLOSED','CANCELLED')
ORDER BY age_days DESC
FETCH FIRST 50 ROWS ONLY;

Table and column names are placeholders. Map them to your maintenance system or ERP schema, and run against a read replica or reporting view, not the live transaction database. Confirm which status values mean closed in your system. Test on a small date range first.

Ask the work order data in plain language

Optional walkthrough of a read-only question layer over your maintenance data.

Optional. The tool and every export work without this. No spam.

How to use the generator

Enter the names of your work order table and the columns that hold the order number, status, open date and station. Set the closed status values and the three bucket limits, then copy the query into your SQL client or reporting tool. The first block gives a summary by station, the second lists the oldest open orders, and the third shows PostgreSQL and Oracle versions of the date arithmetic.

  • Replace every placeholder with a real name before running
  • Use a reporting view where one exists
  • Add a date range filter for large tables

Reading the output

The summary shows for each station how many orders are in each age bucket. A healthy shop has most orders in the youngest buckets. A fat tail in the over 90 day bucket usually means orders waiting on parts, customer approval or a missed closing step rather than active work. Check the detail list to separate those causes, then compare the same station month by month to see whether the tail is growing.

Common mistakes

The most frequent errors are counting cancelled orders as open, aging from the wrong date (creation date rather than induction date) and mixing work orders for different record types, such as quotes, in the same table. Also be careful with time zones when the open date is a timestamp. If your system keeps a status history table, age the order from the date it entered the current status to see how long it has been stuck, not only how old it is.

  • Exclude cancelled and closed statuses
  • Choose the date that matches your turn time definition
  • Check for test or training orders

Frequently Asked Questions

Will this query work on my system as is?

No. Table and column names are placeholders and must be changed to your schema. The logic is standard SQL with date functions for SQL Server, PostgreSQL and Oracle, so only names and date syntax usually need adjusting.

Can I run it against the live ERP database?

Prefer a reporting replica or view. Aggregate queries over large work order tables can slow down transactions, and some vendors do not support direct queries against production tables.

What bucket sizes should I use?

Use limits that match your commitments. Many shops pick 7, 30 and 90 days. If your standard turn time is 21 days, set bucket two to 21 so the report shows what has gone past the promise.

How do I age by status date instead?

Join the status history table and take the latest date for the current status, then use that date in place of the open date column. Column names depend on your system.

If planners ask these questions every week, we can set up a read-only assistant over your maintenance and ERP data that writes and shows the query it ran.