I think you would have to separate this into 2 queries. One to a staging table and then another to overwrite the final file.
Query 1:
SELECT EmailAddress,
Field1,
Field2,
Field3,
Field4,
CASE WHEN Field1 IS NOT NULL AND Field1 != '' THEN 1 ELSE 0 END +
CASE WHEN Field2 IS NOT NULL AND Field2 != '' THEN 1 ELSE 0 END +
CASE WHEN Field3 IS NOT NULL AND Field3 != '' THEN 1 ELSE 0 END +
CASE WHEN Field4 IS NOT NULL AND Field4 != '' THEN 1 ELSE 0 END AS Field5
FROM TableA
This will fill in the total number of not null and not empty columns in your DE. You would then use a second query to pull only those with the highest 'Field5' value per email address like so:
SELECT t.EmailAddress,
t.Field1,
t.Field2,
t.Field3,
t.Field4
FROM [Staging_DE] t
INNER JOIN (
SELECT a.EmailAddress,
MAX(a.Field5) as Field5
FROM [Staging_DE] a
GROUP BY EmailAddress
) mx
ON mx.EmailAddress = t.EmailAddress AND mx.Field5 = t.Field5
Where Staging_DE is the target of your Query 1.
You can technically have this all be inside a single query and just replace Staging_DE with a subquery using Query 1.
E.g.
SELECT t.EmailAddress,
t.Field1,
t.Field2,
t.Field3,
t.Field4
FROM (
SELECT EmailAddress,
Field1,
Field2,
Field3,
Field4,
CASE WHEN Field1 IS NOT NULL AND Field1 != '' THEN 1 ELSE 0 END +
CASE WHEN Field2 IS NOT NULL AND Field2 != '' THEN 1 ELSE 0 END +
CASE WHEN Field3 IS NOT NULL AND Field3 != '' THEN 1 ELSE 0 END +
CASE WHEN Field4 IS NOT NULL AND Field4 != '' THEN 1 ELSE 0 END AS Field5
FROM TableA
) t
INNER JOIN (
SELECT a.EmailAddress,
MAX(a.Field5) as Field5
FROM (
SELECT EmailAddress,
Field1,
Field2,
Field3,
Field4,
CASE WHEN Field1 IS NOT NULL AND Field1 != '' THEN 1 ELSE 0 END +
CASE WHEN Field2 IS NOT NULL AND Field2 != '' THEN 1 ELSE 0 END +
CASE WHEN Field3 IS NOT NULL AND Field3 != '' THEN 1 ELSE 0 END +
CASE WHEN Field4 IS NOT NULL AND Field4 != '' THEN 1 ELSE 0 END AS Field5
FROM TableA
) a
GROUP BY EmailAddress
) mx
ON mx.EmailAddress = t.EmailAddress AND mx.Field5 = t.Field5