web-dev-qa-db-ja.com

クエリのPostgreSQL部門が機能しない

だから本当に休みかなんかありますが、私の人生ではこれがわかりません。分割しようとしていますtier1 by total合計のパーセンテージを取得します。私はこのように考えました:

(tier1 / total) as per

しかし、運はありません。私はこれらをintとしてキャストしますが、まだ何もありません。エラーが発生してクエリが実行されないか、値が0になります。

これが私が作業しようとしているものです:

SELECT count(student_id) as total
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
FROM national_assessments.aimsweb
WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL

私もこのアイデアを持っていましたが、運がありませんでした:

SELECT tier1,total, tier1/total as test
FROM (
    SELECT count(student_id) as total
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
    ,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
    FROM national_assessments.aimsweb
    WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL
) as test
7
Jon

整数除算は小数桁を切り捨てます。式は0と1の間の比率を返しますが、常に0に切り捨てられます。

「パーセンテージ」を取得するには、まず100を掛けます。
小数桁も取得するには、 numeric にキャストします(除算する前に)-または_100.0_を掛けます。数値リテラルに小数桁があると、結果は自動的にnumericになります。

通常、2つの小数桁などに丸めます。そのためにはround()を使用します(numericでのみ機能します)。

取得したクエリに他のいくつかの基本的な最適化を追加します。

_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;
_

カウント手法の説明:

11