There's a quiet frustration that builds when a spreadsheet returns a zero that isn't really there. The user behind this question knows exactly what they want: a filter that respects the difference between a blank cell and a genuine zero, and a result that says NA() when no data exists. That's not a niche concern. It's the difference between a report that tells the truth and one that quietly invents numbers. The fact that this problem requires a workaround at all says less about the user's skill and more about how deeply we've accepted the limitations of traditional spreadsheet logic.
The core issue here is that `FILTER` in this context treats blanks as if they were zeroes, and that conflation is dangerous. When you're pulling from a dataset that changes daily, especially one with 25,000 rows sourced from a SQL query, you can't afford to manually audit every blank. The user tried `IF(ISBLANK(FILTER(...)), NA(), FILTER(...))` and still got a zero. That's not a failure of effort, it's a failure of the tool to distinguish between "no value" and "a value that happens to be zero." For anyone who works with historical records, this is a familiar trap. You end up making decisions based on data that isn't there, and worse, you start to distrust the numbers that are.
What makes this situation particularly telling is that the user has already considered and rejected the common fixes. They can't blanket-replace zeroes because some zeroes are legitimate. They can't append an empty string because that would break the numeric integrity of the result. They're stuck between two bad options: accept a misleading zero or sacrifice the data type. That's not a user problem. That's a design problem. The spreadsheet is forcing a binary where a more nuanced response is required. The fact that they're reaching for `NA()` suggests they want an explicit signal that the data is absent, not a fabricated placeholder.
The practical takeaway is straightforward: when you're building formulas that will outlive the current dataset, you need to test for the edge cases before you trust the output. This user's approach of isolating the filter logic and checking for blanks is correct in spirit, but the execution reveals a deeper limitation in how `FILTER` handles empty results. If your source data can contain blanks, and if those blanks are meaningful, you need to wrap your formula with a check that explicitly evaluates the filtered result for emptiness, not just rely on `ISBLANK` on the formula itself. Try something like `=IF(COUNT(FILTER(...))=0, NA(), FILTER(...))` or use `IFERROR` with a deliberately thrown error. It's not elegant, but it works. And in a world where your data changes daily, working is more important than pretty.