###Result Set

Looking at the result set of your query, there are multiple fields which are not useful, either because they are always `NULL` or will always have the same value because of your query. It just creates noise in the results:

- `PostTypeId` (always 2)
- `AcceptedAnswerId` (always null)
- `Score` (always 0)
- `ViewCount, AnswerCount, FavoriteCount, ClosedDate, Title & Tags` (Answer posts have neither of those, so always null)

###`ORDER BY a.CreationDate DESC`

I think it would make more sense to sort by `ASC` so older Zombies show up first. I also think that `SELECT TOP 100` is more an obstacle than a help. Since the data only refreshes once a week, if we all wanted to reduce the amount of Zombies we could only do the first 100, then have to wait for refresh. I did notice on SEDE you used `SELECT TOP ##Limit:int?100##` which is a better approach, but not part of the code in your question.

###Bugs

You also appear to have a few bugs, likely from a missing `JOIN` or two:

- `OwnerDisplayName` is always `NULL` even though the `OwnerUserId` is always present. (also it's not particularly useful anyways, since you have `u.Id AS [User Link]`. 

- `LastEditorDisplayName` is always `NULL` even when a `LastEditorUsedId` is present. One remark on this, in the vast majority of cases it is a self-edit, so I'm not sure how useful that data really is. 

---

It looks like your `JOIN` with a subquery and other sub-`JOIN` is silently selecting a bunch of question-related data for display that you don't need, which would explain all the extra columns mentioned above. 

I moved some things around to eliminate the unnecessary subquery `JOIN` and moved the `MAX(a.Score)` aggregate up into your primary `SELECT` (notice the `HAVING` clause at the very end) so this way it returns only the useful data, and simplifies the execution plan and maintainability. 

###[SEDE Query](http://data.stackexchange.com/codereview/query/267053/forgotten-zombie-killers?DisplayName=+&UserId=-1&Limit=100)

    DECLARE @username AS NVARCHAR(60) = ##DisplayName:string? ##;
    DECLARE @userId AS INT = ##UserId:int?-1##;
    
    SELECT TOP ##Limit:int?100##
      u.Id AS [User Link],
      a.Id AS [Post Link],
      a.CreationDate,
      MAX(a.Score) AS MaxAnswerScore
    FROM Posts a
      JOIN Users u 
      	ON a.OwnerUserId = u.Id
      JOIN Posts q
      	ON a.ParentId = q.Id
    WHERE 
      (@username = '' OR u.DisplayName = @username)
      AND (@userId = -1 OR u.Id = @userId)
      AND a.Score = 0
      AND q.AcceptedAnswerId IS NULL
    GROUP BY
      u.Id,
      a.Id,
      a.CreationDate
    HAVING 
      MAX(a.Score) = 0
    ORDER BY a.CreationDate ASC