Pie Charts
From PostgreSQL wiki
Jump to navigationJump to search
Based on the original idea by Shlomi Noach at
http://code.openark.org/blog/mysql/sql-pie-chart
Change the "VALUES" subquery to use a different data set.
\set width 80 \set height 25 \set radius 1.0 \set colours '''#;o:X"@+-=123456789abcdef'''
WITH slices AS (
SELECT CAST(row_number() over () AS integer) AS slice,
name,
value,
100.0 * value / sum(value) OVER () AS percentage,
2*PI() * sum(value) OVER (rows unbounded preceding)
/ sum(value) OVER () AS radians
FROM (VALUES ('red',1),
('blue',2),
('orange',3),
('white',4)
) AS data(name,value))
(
SELECT array_to_string(array_agg(c),'') AS pie_chart
FROM (
SELECT x, y,
CASE WHEN NOT (sqrt(pow(x, 2) + pow(y, 2))
BETWEEN :radius*1/10 AND :radius)
THEN ' '
ELSE substring(:colours,
(select min(slice)
from slices
where radians >= PI() + atan2(y,-x)),
1)
END AS c
FROM (SELECT 2.0*generate_series(0,:width)/:width-1.0) AS x(x),
(SELECT 2.0*generate_series(0,:height)/:height-1.0) AS y(y)
ORDER BY y,x
) AS xy
GROUP BY y
ORDER BY y
)
UNION ALL
SELECT repeat(substring(:colours,slice,1), 2) || ' ' ||
name || ': ' ||
value || ' (' || round(percentage,0) || '%)'
FROM slices;
Result:
pie_chart
-----------------------------------------------------------------------------------
;
oooo;;;;;;;;;;;;;;;;;;;;;;;;;;;
ooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
oooooooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ooooooooooooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ooooooooooooooooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
oooooooooooooooooooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;######
oooooooooooooooooooooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###########
ooooooooooooooooooooooooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;##################
ooooooooooooooooooooooooooooooooooo;;;;;;;;;;;;;;;;;;;#######################
ooooooooooooooooooooooooooooooooooooo;;;;;;;;;;;;;;############################
oooooooooooooooooooooooooooooooooooooo;;;;;;;;#################################
oooooooooooooooooooooooooooooooooooo ####################################
oooooooooooooooooooooooooooooooooooo ::::::::::::::::::::::::::::::::::::
ooooooooooooooooooooooooooooooooo::::::::::::::::::::::::::::::::::::::::::::::
oooooooooooooooooooooooooooo:::::::::::::::::::::::::::::::::::::::::::::::::::
ooooooooooooooooooooooo::::::::::::::::::::::::::::::::::::::::::::::::::::::
oooooooooooooooooo:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ooooooooooo::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
oooooo:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::
:
## red: 1 (10%)
;; blue: 2 (20%)
oo orange: 3 (30%)
:: white: 4 (40%)
(30 rows)