Product

Visual ETL for PostgreSQL: Clean and Prepare Data Without Complex SQL

The DataQloo Team··5 min read

Every Monday, the same 45 minutes

Every Monday morning, someone on the sales team exports the week's orders out of PostgreSQL — a few thousand rows, sometimes tens of thousands during a busy quarter. Before that data can go anywhere near a report, they spend the next 45 minutes doing the same three things: filtering out cancelled orders, grouping what's left by region, and re-totaling revenue so leadership sees one clean number per region instead of a wall of transactions.

It's not hard work. It's just the same work, done by hand, every single week — and if that person is out sick on a Monday, the report doesn't go out until they're back.

This is what a visual ETL workflow for PostgreSQL replaces: not the database, not the data, just the repetitive 45 minutes standing between a raw table and a number someone can actually use.

Why this keeps happening

Most teams in this position don't have a data engineer on call and don't have budget for a full BI platform — they have a PostgreSQL database, someone who knows enough SQL to write a query if they have to, and a report that's needed regardless of whether that person has time this week. So the query gets written once, then rewritten from memory (or copy-pasted and edited) every time the report is due, because there's no shared, reusable place for it to live between runs.

The underlying data doesn't change shape from week to week. The process to turn it into a report does — because it's redone from scratch instead of reused. (See SQL vs. visual data prep for a broader look at that tradeoff.)

The manual approach

Concretely, "clean this up by hand" usually looks like:

  1. Export the relevant table (or run a SELECT *) into a spreadsheet.
  2. Scroll through and delete or filter out rows where status = 'cancelled'.
  3. Insert a pivot table or a handful of SUMIF formulas to total revenue by region.
  4. Sort the result so the biggest region is on top, because that's what gets asked for first.
  5. Reformat it to look like a report instead of a spreadsheet, and send it.

Every one of those steps is easy in isolation. The problem is that steps 1–5 happen again, from scratch, the next time the report is due — usually by whoever's free that day, not necessarily the person who built the process the week before.

Why the manual version breaks

  • It doesn't survive the person who built it. If the SUMIF formulas or the filter logic live in one person's head or one person's spreadsheet, the report has a single point of failure.
  • It's error-prone precisely because it's repetitive. Manually filtering "cancelled" out of a status column is exactly the kind of task where a missed row or a typo goes unnoticed until someone downstream asks why the numbers don't match last week's.
  • It doesn't scale with the data. A process built for a few thousand rows in a spreadsheet gets noticeably worse — slower, more error-prone, sometimes literally too large to open cleanly — as the export grows.
  • Nobody can verify it after the fact. A finished spreadsheet shows a result, not the logic that produced it. Six months later, nobody can easily confirm whether "cancelled" orders were actually excluded correctly.

The same report, built once, on a canvas

Here's the same Monday report, built as a DataQloo workflow against a PostgreSQL orders table — five nodes, no SQL written by hand, and saved so it can be rerun next Monday without rebuilding anything.

Step 1 — connect the source

Drop an Input node on the canvas and select the Sales Orders table via a saved PostgreSQL connection. If a connection isn't saved yet, the Input node's picker configures one inline — host, credentials, and the table to read from.

Step 2 — filter out cancelled orders

Add a Filter node after the Input node and set the condition to status ≠ cancelled. The node's label on the canvas updates immediately to show exactly what's being excluded — no need to open the node again later to remember what it does.

Step 3 — total revenue by region

Add a Summarize node, set the measure to SUM(revenue), and group by region. The node reads "Revenue — SUM · by Region" on the canvas, matching how you'd describe the number out loud to someone else.

Step 4 — sort, biggest region first

Add a Sort node on revenue, descending — because when this report lands in an inbox, the first question is always "which region did the best."

Step 5 — check the result, and the query

Attach a Browse node to see the results grid, the inferred schema, a column profile, and the SQL tab — a read-only view of the exact, parameterized query DataQloo is actually running:

SELECT region, SUM(revenue) AS revenue
FROM sales_orders
WHERE status <> $1
GROUP BY region
ORDER BY revenue DESC

Nothing here is a paraphrase of what's happening — it's the real query, visible to anyone who wants to check it before trusting the number.

What comes out the other side

A slice of what goes in — a raw pull from sales_orders, cancelled rows included:

order_idorder_datecustomerregionsales_reprevenuestatus
10012026-06-01Meridian RetailWestJ. Alvarez14,400completed
10022026-06-01Bluepeak IncNorthT. Kim3,150completed
10032026-06-02Carrow & SonsSouthJ. Alvarez9,600cancelled
10042026-06-02Meridian RetailWestR. Douglas8,000completed
10052026-06-03Nova SystemsEastT. Kim4,200completed
10062026-06-03Carrow & SonsSouthJ. Alvarez3,600completed
10072026-06-04Bluepeak IncNorthR. Douglas3,600cancelled
10082026-06-04Nova SystemsEastT. Kim6,600completed

And what the workflow produces — cancelled orders excluded, totaled and sorted by region:

regionrevenue
West22,400
East10,800
North3,150
South3,600

That's the entire Monday report. The same five nodes run again next week against whatever new rows have landed in sales_orders — nothing gets rebuilt, and the logic is exactly the same as it was the week before, because it's the same workflow, not a rewritten query.

Key takeaways

  • A workflow that filters, summarizes, and sorts PostgreSQL data can be built once on a visual canvas, with zero SQL written by hand.
  • The generated query is always visible — not a black box, not a paraphrase of the logic.
  • The real advantage isn't the canvas or even PostgreSQL specifically — it's that this workflow gets saved and rerun, instead of rebuilt from scratch the next time the report is due. That's the difference between 45 minutes every Monday and a few seconds.
  • The same pattern — connect, filter, summarize, sort — works for any single-table PostgreSQL report: inventory counts, signups by week, expenses by category.

Next

For this same pattern applied to a real recurring deadline, see building a monthly close report without an analyst on call. If your data doesn't live in PostgreSQL at all — a spreadsheet export instead of a live connection — importing a CSV into a reusable dataset walks through the same idea starting from a file instead of a database table.

Try it yourself

Connect a PostgreSQL table and build this exact five-node workflow in the Visual Designerget early access to try it against your own data.

ShareXLinkedIn

Related reading

Get new posts by email

Engineering notes and product updates from the DataQloo team, occasionally.