Обсуждение: Get multiple columns with counts from one table.
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.
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.
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
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.