Counts and percentages and such

Started by jackassplusover 16 years ago9 messagesgeneral
Jump to latest
#1jackassplus
jackassplus@gmail.com

I'm new to both pgsql and SQL in general pas really simple stuff, so
i would like to know how to;

Given a table with a column that can have one of NULL, (char) N,
(char) A, and (char) L. Is there a way to in a single query, ge the
percentage of the whole rowset that each of those represents?

like :

75% Null
15% A
5% N
5% L

#2Scott Marlowe
scott.marlowe@gmail.com
In reply to: jackassplus (#1)
Re: Counts and percentages and such

On Tue, Dec 8, 2009 at 11:50 AM, jackassplus <jackassplus@gmail.com> wrote:

I'm new to both pgsql and SQL in  general pas really simple stuff, so
i would like to know how to;

Given a table with a column that can have one of NULL, (char) N,
(char) A, and (char) L. Is there a way to in a single query, ge the
percentage of the whole rowset that each of those represents?

like :

75% Null
15% A
5% N
5% L

Sure. What you're looking at are aggregates and groupings.

select coalesce(col,'Null'), count(coalesce(col,'Null')) from
sometable group by col

will give you the basic counts for each one. For percentages, we do
the "part divided by the whole * 100" thing...

select coalesce(col,'Null'),
(count(coalesce(col,'Null'))::numeric/(select count(*) from
some_table))*100 from some_table group by col;
coalesce | ?column?
----------+-------------------------
Null | 13.33333333333333333300
N | 20.00000000000000000000
A | 26.66666666666666666700
L | 40.00000000000000000000

Note that it works, but we get long ugly numbers, and the column has
no name (?column?). Let's fix that:

select coalesce(col,'Null'),
((count(coalesce(col,'Null'))::numeric/(select count(*) from
some_table))*100)::numeric(12,2) as percentage from some_table group
by col;
coalesce | percentage
----------+------------
Null | 13.33
N | 20.00
A | 26.67
L | 40.00

If you want an actual percentage sign you'll have to cast to text and
add it on (or make your own type, but that seems like a lot of work
for such a simple thing):

select coalesce(col,'Null'),
(((count(coalesce(col,'Null'))::numeric/(select count(*) from
some_table))*100)::numeric(12,2))::text||'%' as percentage from
some_table group by col;
coalesce | percentage
----------+------------
Null | 13.33%
N | 20.00%
A | 26.67%
L | 40.00%

There ya go.

#3jackassplus
jackassplus@gmail.com
In reply to: jackassplus (#1)
Re: Counts and percentages and such

<snip>

select coalesce(col,'Null'),
(count(coalesce(col,'Null'))::numeric/(select count(*) from
some_table))*100 from some_table group by col;
 coalesce |        ?column?
----------+-------------------------
 Null     | 13.33333333333333333300
 N        | 20.00000000000000000000
 A        | 26.66666666666666666700
 L        | 40.00000000000000000000

Note that it works, but we get long ugly numbers, and the column has
no name (?column?).  Let's fix that:

What does ::numeric signify?
I'm using the jdbc driver from http://jdbc.postgresql.org/ in SQuirreL
and it asks me for the value of :numeric.

#4Scott Marlowe
scott.marlowe@gmail.com
In reply to: jackassplus (#3)
Re: Counts and percentages and such

On Tue, Dec 8, 2009 at 2:21 PM, jackassplus <jackassplus@gmail.com> wrote:

<snip>

select coalesce(col,'Null'),
(count(coalesce(col,'Null'))::numeric/(select count(*) from
some_table))*100 from some_table group by col;
 coalesce |        ?column?
----------+-------------------------
 Null     | 13.33333333333333333300
 N        | 20.00000000000000000000
 A        | 26.66666666666666666700
 L        | 40.00000000000000000000

Note that it works, but we get long ugly numbers, and the column has
no name (?column?).  Let's fix that:

What does ::numeric signify?
I'm using the jdbc driver from http://jdbc.postgresql.org/ in SQuirreL
and it asks me for the value of :numeric.

::numeric is a cast in pgsql. The long version looks like:

cast (col as numeric)

which might work better. I'm no expert on the jdbc driver so your
question may require someone else to give a definitive answer.

#5Scott Marlowe
scott.marlowe@gmail.com
In reply to: Scott Marlowe (#4)
Re: Counts and percentages and such

Btw, Squirrel sucks, I tried using it in my last job and it got in the
way more than it helped with pgsql. I just use psql or pgadmin III if
I need a gui.

#6Thomas Kellerer
spam_eater@gmx.net
In reply to: jackassplus (#3)
Re: Counts and percentages and such

jackassplus wrote on 08.12.2009 22:21:

What does ::numeric signify?
I'm using the jdbc driver from http://jdbc.postgresql.org/ in SQuirreL
and it asks me for the value of :numeric.

As Scott has pointed out this is a typecast.

If Squirrel mistakes that for a parameter, it's clearly a bug in Squirrel.
But maybe that prompting for parameters can be turned off somewhere (I don't use Squirrel, so I cannot tell)

Thomas

#7Scott Marlowe
scott.marlowe@gmail.com
In reply to: Thomas Kellerer (#6)
Re: Counts and percentages and such

On Tue, Dec 8, 2009 at 3:09 PM, Thomas Kellerer <spam_eater@gmx.net> wrote:

jackassplus wrote on 08.12.2009 22:21:

What does ::numeric signify?
I'm using the jdbc driver from http://jdbc.postgresql.org/ in SQuirreL
and it asks me for the value of :numeric.

As Scott has pointed out this is a typecast.
If Squirrel mistakes that for a parameter, it's clearly a bug in Squirrel.
But maybe that prompting for parameters can be turned off somewhere (I don't
use Squirrel, so I cannot tell)

My experience with Squirrel was that it worked fine for very simple
queries, and as soon as you got outside the box it started doing the
stuff the OP is seeing. For postgresql the preferred GUI is pgadmin
III, but psql is the best text only interface for a db on the planet.

#8jackassplus
jackassplus@gmail.com
In reply to: jackassplus (#1)
Re: Counts and percentages and such

My experience with Squirrel was that it worked fine for very simple
queries, and as soon as you got outside the box it started doing the
stuff the OP is seeing.  For postgresql the preferred GUI is pgadmin
III, but psql is the best text only interface for a db on the planet.

I'm just using squirrel to test queries prior to throwing them into
perl. Thanks everybody for the help.

#9Rakotomandimby Mihamina
mihamina@gulfsat.mg
In reply to: jackassplus (#8)
Re: Counts and percentages and such

jackassplus <jackassplus@gmail.com> :
I'm just using squirrel to

Sure!
But it's bad.

--
Architecte Informatique chez Blueline/Gulfsat:
Administration Systeme, Recherche & Developpement
+261 34 29 155 34 / +261 33 11 207 36