このようなクエリを考えると、
CREATE TABLE foo(grp)
AS VALUES ('a'),('a'),('b'),('b'),('b'),('c'),('c'),('c'),('c'),('e');
私は使えます GROUP BY
をa
、b
、c
、e
に集計しますが、どのようにして異なるグループとそれらの合計テーブルのパーセンテージを返すことができますか表す?
a | 20%
b | 30%
c | 40%
e | 10%
コンピュータに保存した場合、最初のパーセンテージは常に[0-1)
の範囲になります。それらを0-100
の範囲でレンダリングすることは通常、ディスプレイ(アプリ)の機能です。ウィキペディアから、
たとえば、
45%
(「45パーセント」と読みます)は45 / 100
、45:100
、または0.45
と等しくなります。
たとえば、単純なテーブルがある場合。
CREATE TABLE foo(grp)
AS VALUES ('a'),('a'),('b'),('b'),('b'),('c'),('c'),('c'),('c'),('e');
あなたがしなければならないすべては
SELECT foo.grp, count(*) / tablestat.total::float AS percent_total
FROM foo
CROSS JOIN (SELECT count(*) AS total FROM foo) AS tablestat
GROUP BY tablestat.total, foo.grp
ORDER BY grp;
grp | percent_total
-----+---------------
a | 0.2
b | 0.3
c | 0.4
e | 0.1
(4 rows)
percent
を文字列のように表示したい場合も、簡単に行うことができます。これは単なる視覚的な表示であるため、データベースではこれを行わないことをお勧めしますが、can;このような関数は単純で、数値を計算する数学から、数値をどのようにレンダリングするかについての不明瞭な詳細を隠します。
CREATE FUNCTION display_percent(x double precision)
RETURNS text
AS $$
SELECT (x*100)::text || '%'
$$ LANGUAGE sql
IMMUTABLE;
COMMENT ON FUNCTION display_percent
IS $$Render a number in the range of [0-1) as a text-string (ex., 0.17 to '17%')$$;
そこにあります
SELECT foo.grp, display_percent(count(*) / tablestat.total::float) AS percent_total
FROM foo
CROSS JOIN (SELECT count(*) AS total FROM foo) AS tablestat
GROUP BY tablestat.total, foo.grp
ORDER BY grp;
grp | percent_total
-----+---------------
a | 20%
b | 30%
c | 40%
e | 10%
(4 rows)
外部選択にfrom句がありません
SELECT location,
COUNT(*) AS total,
(COUNT(*) * 100)/(SELECT COUNT(*) FROM table1) AS percentage
FROM table1
WHERE extract(year from date) = 2018 GROUP BY location;
それを次のように行う方が良いでしょう
WITH w_table_count AS (
SELECT COUNT(0) AS table_count
FROM table1
)
SELECT t.location,
t.count(t.date) AS TOTAL
(count(t.date)/wt.table_count) * 100 AS percentage
FROM table1 t, w_table_count
WHERE extract(year from t.date) = 2018 GROUP BY t.location;