Search Postgresql Archives

Re: Not able to understand how to write group by

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Steve Crawford wrote
> On 07/02/2014 09:55 AM, Arup Rakshit wrote:
>> SELECT users.gender,count(*) as
>> participant,avg(daily_action_answers.value) as
>> value
>> FROM "users" INNER JOIN "daily_action_answers" ON
>> "daily_action_answers"."user_id" = "users"."id"
>> INNER JOIN "measures" ON "measures"."id" =
>> "daily_action_answers"."measure_id"
>> WHERE (((daily_action_answers.day between now() and 
> <last_date_of_year>
> ) and
>> daily_action_answers.daily_action_id = 1))
>> GROUP BY users.gender, measures.option
>>
>> This is producing the below
>>
>> gender  |    participants  |   value
>>     n                   2                  12
>>     n                   1                  3
>>     m                  1                   4
>>     m                  4                  12
>>     f                    3                  23
>>     f                   4                  15
>>
>> Here n.m,f it comes 2 times, because the possible answer is 2. That's the
>> problem with my current query. I don't understand which average value for
>> which answer.
>>
>> Can we make the output as below ?
>>
>> gender    participants       answer1_avg   answer2_avg
>> n                      3                     12                  3
>> m                      5                     4                  12
>> f                       7                    15                    23
>>
>>
>>
> As mentioned by jared, the problem is the additional group by 
> measures.option which needs to be eliminated. To better understand what 
> is happening, just add measures.option to your list of output columns. 
> Right now the grouping is hidden because you aren't showing that column.

Are you sure this is what you want? 

Since there are two columns you will have to either use a CASE or a select
to facilitate calculating the values for each of the columns. 

SELECT gender, answer1_avg, answer2_avg 
FROM (SELECT DISTINCT gender FROM ...) gn 
LEFT JOIN (SELECT gender, answer1_avg FROM ...) ans1 USING (gender) 
LEFT JOIN (SELECT gender, answer2_avg FROM ...) ans2 USING (gender) 

You could also try learning "crosstab" from the "tablefunc" extension: 

http://www.postgresql.org/docs/9.3/interactive/tablefunc.html

I do not see how a single "participant count" column will provide a
meaningful piece of data... 

David J. 



--
View this message in context: http://postgresql.1045698.n5.nabble.com/Not-able-to-understand-how-to-write-group-by-tp5810250p5810283.html
Sent from the PostgreSQL - general mailing list archive at Nabble.com.



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux