You can always do a search in the repository like this:
{[]:[Field Name]="*"}
That will return any entries with a value in that field.
But I can understand wanting to do a query instead. You don't have to wait for the program to load a list of entries, and you don't have to work down the list of individual fields.
Here's a query, that when run against your Repository database, checks against the propdef table and the propval table to try to get a count of how many entries have a value in each field:
SELECT
def.[prop_id],
def.[prop_name],
SUM(
CASE
WHEN val.str_val IS NULL THEN 0
WHEN val.str_val = '' THEN 0
ELSE 1
END
+
CASE
WHEN val.num_val IS NULL THEN 0
ELSE 1
END
+
CASE
WHEN val.date_val IS NULL THEN 0
ELSE 1
END
+
CASE
WHEN val.bin_val IS NULL THEN 0
ELSE 1
END
) AS value_count
FROM [propval] AS val
LEFT JOIN [propdef] AS def ON def.[prop_id] = val.[prop_id]
GROUP BY def.[prop_id], def.[prop_name]
ORDER BY def.[prop_id], def.[prop_name]
Note that against a test environment with only a few thousand entries, that query wasn't too bad, only taking about 20 seconds to run. But against a live environment with many millions of entries, it was looking to take MUCH longer to run. So I added a WHERE statement to limit how many different fields it looks at with each run. I limited it to 10 fields in this case, and it still took about a minute to run. Then the next search just requires incrementing the WHERE statement from "1 AND 10" to "11 AND 20", then "21 AND 30", etc., etc.
SELECT
def.[prop_id],
def.[prop_name],
SUM(
CASE
WHEN val.str_val IS NULL THEN 0
WHEN val.str_val = '' THEN 0
ELSE 1
END
+
CASE
WHEN val.num_val IS NULL THEN 0
ELSE 1
END
+
CASE
WHEN val.date_val IS NULL THEN 0
ELSE 1
END
+
CASE
WHEN val.bin_val IS NULL THEN 0
ELSE 1
END
) AS value_count
FROM [propval] AS val
LEFT JOIN [propdef] AS def ON def.[prop_id] = val.[prop_id]
WHERE val.[prop_id] BETWEEN 1 AND 10
GROUP BY def.[prop_id], def.[prop_name]
ORDER BY def.[prop_id], def.[prop_name]
EDIT TO ADD: Here's a better query, based on feedback from @████████and more testing of my own. This was drastically faster to run:
SELECT
def.[prop_id],
def.[prop_name],
CASE
WHEN subquery.value_count IS NULL THEN 0
ELSE subquery.value_count
END AS value_count
FROM [propdef] AS def
LEFT JOIN (
SELECT
def.[prop_id],
def.[prop_name],
COUNT(def.[prop_id]) AS value_count
FROM [propval] AS val
LEFT JOIN [propdef] AS def ON def.[prop_id] = val.[prop_id]
WHERE (val.str_val IS NOT NULL AND val.str_val <> '')
OR val.num_val IS NOT NULL
OR val.date_val IS NOT NULL
OR val.bin_val IS NOT NULL
GROUP BY def.[prop_id], def.[prop_name]
) AS subquery ON subquery.[prop_id] = def.[prop_id]
ORDER BY def.[prop_id]