5

グループ化できるデータセットがあり、各グループの行の割合を知りたいです。

これは、タイプキャストが欠落しているためにすべてのグループに対して0を返すことを除いて、ほぼ機能しているようです

SELECT COUNT(*) / (SELECT COUNT(name) 
                    FROM x 
                    WHERE d = '0') 
  FROM x, y 
  WHERE x.a = y.a AND x.b = '0' 
  GROUP BY y.c 
  ORDER BY y.c ASC

これを正しくキャストするにはどうすればよいですか?

4

3 に答える 3

5

あなたはできるはずです

select 1.0 * count(*) / .....
于 2012-05-07T13:21:10.490 に答える
4

を掛けるのではなく、1.0単にキャストできます。それは私にとってよりクリーンで明確に思えます。1 つには、使用するデータ型が明確になります。正確な計算に余分なコストを支払うよりも、float4または近似の精度に十分満足するかもしれません。float8numeric

SELECT COUNT(*)::float / (SELECT COUNT(name) 
                           FROM x 
                           WHERE d = '0')::float
  FROM x, y 
  WHERE x.a = y.a AND x.b = '0' 
  GROUP BY y.c 
  ORDER BY y.c ASC
test=# select 1.0 * 5 / 10;
        ?桁?        
------------------------
 0.50000000000000000000
(1行)

test=# select pg_typeof(1.0 * 5 / 10);
 pg_typeof
-----------
 数値
(1行)

test=# select 5::float / 10::float;
 ?桁?
----------
      0.5
(1行)

test=# select pg_typeof(5::float / 10::float);
    pg_typeof     
------------------
 倍精度
(1行)
于 2012-05-07T14:18:34.113 に答える
1

問題に変換するとfloat、問題が解決する可能性があります。

SELECT convert(double, COUNT(*)) / (SELECT convert(double, COUNT(name)) 
                    FROM x 
                    WHERE d = '0') 
  FROM x, y 
  WHERE x.a = y.a AND x.b = '0' 
  GROUP BY y.c 
  ORDER BY y.c ASC
于 2012-05-07T13:21:58.130 に答える