Thread: Get multiple columns with counts from one table.

Get multiple columns with counts from one table.

From
chuydb
Date:
Hi,
From two columns in my table I want to get a unified count for the values in
these columns.
As an example, two columns are:

Table: reports
|    type        |    place        |
-----------------------------------------
|    one        |    home        |
|    two        |    school    |
|    three        |    work        |
|    four        |    cafe        |
|    five        |    friends    |
|    six         |    mall        |
|    one        |    work        |
|    one        |    work        |
|    three        |    work        |
|    two        |    cafe        |
|    five        |    cafe        |
|    one         |    home        |

If I do:
SELECT type, count(*) from reports
group by type

I get:
|    type        |    count    |
----------------------------------
|    one        |    4    |
|    two        |    2    |
|    three        |    2    |
|    four        |    1    |
|    five        |    2    |
|    six         |    1    |

Im trying to get something like this: (one column with my types grouped
together and multiple columns with the count vales for each place)
I get:
|    type        |    home    |    school    |    work    |    cafe    |    friends    |    mall    |
-------------------------------------------------------------------------------------------------------------------
|    one        |    2    |            |    2    |        |            |        |
|    two        |        |    1        |        |    1    |            |        |
|    three        |        |            |    2    |        |            |        |
|    four        |        |            |        |    1    |            |        |
|    five        |        |            |        |    1    |    1        |        |
|    six         |        |            |        |        |            |    1    |

which would be the result of running a count for every place like this:
SELECT type, count(*) from reports where place  = 'home'
group by type
SELECT type, count(*) from reports where place  = 'school'
group by type
SELECT type, count(*) from reports where place  = 'work'
group by type
SELECT type, count(*) from reports where place  = 'cafe'
group by type
SELECT type, count(*) from reports where place  = 'friends'
group by type
SELECT type, count(*) from reports where place  = 'mall'
group by type

Is this possible with postgresql???

Thanks in advance.




--
View this message in context:
http://postgresql.1045698.n5.nabble.com/Get-multiple-columns-with-counts-from-one-table-tp5758977.html
Sent from the PostgreSQL - general mailing list archive at Nabble.com.


Re: Get multiple columns with counts from one table.

From
Alban Hertroys
Date:
On Jun 13, 2013, at 24:09, chuydb <jdelbosque@cic.mx> wrote:

> Hi,
> From two columns in my table I want to get a unified count for the values in
> these columns.
> As an example, two columns are:
>
> Table: reports
> |    type        |    place        |
> -----------------------------------------
> |    one        |    home        |
> |    two        |    school    |
> |    three        |    work        |
> |    four        |    cafe        |
> |    five        |    friends    |
> |    six         |    mall        |
> |    one        |    work        |
> |    one        |    work        |
> |    three        |    work        |
> |    two        |    cafe        |
> |    five        |    cafe        |
> |    one         |    home        |
>
> If I do:
> SELECT type, count(*) from reports
> group by type
>
> I get:
> |    type        |    count    |
> ----------------------------------
> |    one        |    4    |
> |    two        |    2    |
> |    three        |    2    |
> |    four        |    1    |
> |    five        |    2    |
> |    six         |    1    |
>
> Im trying to get something like this: (one column with my types grouped
> together and multiple columns with the count vales for each place)
> I get:
> |    type        |    home    |    school    |    work    |    cafe    |    friends    |    mall    |
> -------------------------------------------------------------------------------------------------------------------
> |    one        |    2    |            |    2    |        |            |        |
> |    two        |        |    1        |        |    1    |            |        |
> |    three        |        |            |    2    |        |            |        |
> |    four        |        |            |        |    1    |            |        |
> |    five        |        |            |        |    1    |    1        |        |
> |    six         |        |            |        |        |            |    1    |
>
> which would be the result of running a count for every place like this:
> SELECT type, count(*) from reports where place  = 'home'
> group by type
> SELECT type, count(*) from reports where place  = 'school'
> group by type
> SELECT type, count(*) from reports where place  = 'work'
> group by type
> SELECT type, count(*) from reports where place  = 'cafe'
> group by type
> SELECT type, count(*) from reports where place  = 'friends'
> group by type
> SELECT type, count(*) from reports where place  = 'mall'
> group by type
>
> Is this possible with postgresql???


You can do that like this:

SELECT type, SUM(CASE place WHEN 'home' THEN 1 ELSE 0 END),
    SUM(CASE place WHEN 'school' THEN 1 ELSE 0 END),
    etc.
FROM reports
WHERE place IN ('home', 'school', etc.)
GROUP BY type

Alban Hertroys
--
If you can't see the forest for the trees,
cut the trees and you'll find there is no forest.



Re: Get multiple columns with counts from one table.

From
Sergey Konoplev
Date:
On Wed, Jun 12, 2013 at 3:09 PM, chuydb <jdelbosque@cic.mx> wrote:
> Im trying to get something like this: (one column with my types grouped
> together and multiple columns with the count vales for each place)
> I get:
> |       type            |       home    |       school  |       work    |       cafe    |       friends |       mall
 | 
> -------------------------------------------------------------------------------------------------------------------
> |       one             |       2       |                       |       2       |               |
 |               | 
> |       two             |               |       1               |               |       1       |
 |               | 
> |       three           |               |                       |       2       |               |
 |               | 
> |       four            |               |                       |               |       1       |
 |               | 
> |       five            |               |                       |               |       1       |       1
 |               | 
> |       six             |               |                       |               |               |
 |       1       | 

First you need to get the counts by grouping by type and place
together, and then crosstab(text source_sql, text category_sql) from
the tablefunc module will help you to get this.

http://www.postgresql.org/docs/9.2/static/tablefunc.html#AEN144882

It is documented pretty good and has a lot of useful examples.

--
Kind regards,
Sergey Konoplev
PostgreSQL Consultant and DBA

Profile: http://www.linkedin.com/in/grayhemp
Phone: USA +1 (415) 867-9984, Russia +7 (901) 903-0499, +7 (988) 888-1979
Skype: gray-hemp
Jabber: gray.ru@gmail.com


Re: Get multiple columns with counts from one table.

From
chuydb
Date:
Thanks for your quick answer...!
Ill try this out to see if I can get it working.



--
View this message in context:
http://postgresql.1045698.n5.nabble.com/Get-multiple-columns-with-counts-from-one-table-tp5758977p5758981.html
Sent from the PostgreSQL - general mailing list archive at Nabble.com.