PostgreSQL Division In Query Not Working
Integer division truncates fractional digits. Your expression returns a ratio between 0 and 1, which is always truncated to 0.

To get "percentage", first multiply by 100.
To also get fractional digits, cast to numeric (before you divide) - or multiply by 100.0. The presence of a fractional digit in the numeric literal coerces the result to numeric automatically.

Typically, you would round to two fractional digits or something. Use round() for that (only works for numeric).

Adding some other basic optimizations to the query you get:

SELECT total
      ,tier1, round((tier1 * 100.0) / total, 2) AS tier1_pct
      ,tier2, round((tier2 * 100.0) / total, 2) AS tier2_pct
      ,tier3, round((tier3 * 100.0) / total, 2) AS tier3_pct
FROM  (
   SELECT count(*) AS total
         ,count(fall_september_tier = 1 OR NULL) AS tier1
         ,count(fall_september_tier = 2 OR NULL) AS tier2
         ,count(fall_september_tier = 3 OR NULL) AS tier3
   FROM   national_assessments.aimsweb
   WHERE  general_outcome_measure = 'PSF'
   AND    fall_september_tier IS NOT NULL
   ) sub;


Explanation for the counting technique:


For absolute performance, is SUM faster or COUNT?