Обсуждение: create aggregate function 'count_bool( column_name, boolean )'
<div class="Section1"><p class="MsoNormal"><tt><font face="Courier New" size="2"><span style="font-size: 10.0pt">Hello,</span></font></tt><font face="Courier New" size="2"><span style="font-size:10.0pt;font-family:"Courier New""><br/><tt><font face="Courier New">I'd like to create a function called count_bool( column_name, boolean ) in PostgreSQL.</font></tt><br/><br /><tt><font face="Courier New">this function is similar to the count( column_name ) functionbut will only count the trues or falses based on the other input parameter boolean. e.g. if you pass in a 'true',all the trues will be counted but not the falses -- it's the same but opposite if the 'false' was passed in.</font></tt><br/><br /></span></font><p class="MsoNormal"><font face="Courier New" size="2"><span style="font-size:10.0pt; font-family:"Courier New"">I’d like this aggregate function to be developed with the SQL language instead of ‘C’ (for maintenancereasons). <tt><font face="Courier New">From the surface, it appears to be an incredibly simple job only to findthat it's difficult. </font></tt></span></font><p class="MsoNormal"><font face="Courier New" size="2"><span style="font-size:10.0pt; font-family:"Courier New""><br /><tt><font face="Courier New">In some respects, I can't believe this function doesn't existin SQL</font></tt><br /><br /><tt><font face="Courier New">so now I can create the statement</font></tt><br /><tt><fontface="Courier New">select distict product_id, count_bool(purchased, true), count_bool(was_selected, true) fromsome_table group by product_id;</font></tt><br /><br /><tt><font face="Courier New">instead of breaking the query into3 seperate queries</font></tt><br /><br /><tt><font face="Courier New">select distict product_id from some_table;</font></tt><br/><tt><font face="Courier New">select count(purchased) from product_id where purchased = true;</font></tt><br/><tt><font face="Courier New">select count(was_selected) from some_table where was_selected = true;</font></tt><br/><br /></span></font><p class="MsoNormal"><font face="Courier New" size="2"><span style="font-size:10.0pt; font-family:"Courier New"">Am I missing a detail with SQL based aggregate function development?</span></font><p class="MsoNormal"><fontface="Courier New" size="2"><span style="font-size:10.0pt; font-family:"Courier New""><br /><tt><font face="Courier New">Any help would be appreciated.</font></tt><br /><br /><tt><fontface="Courier New">Thanks!</font></tt></span></font><font face="Arial" size="2"><span style="font-size:10.0pt;font-family:Arial"></span></font></div>
James, I know Postgresql doesn't have 2 arg aggregate functions. what you could do is the following (untested) select distict product_id, sum(case when purchased then 1 else 0 end) as purchased, sum(case when was_selected then 1 else 0 end) as was_selected from some_table group by product_id; Jim ---------- Original Message ----------- From: "James Moliere" <jmoliere@ucsd.edu> To: <pgsql-sql@postgresql.org> Sent: Fri, 7 Jul 2006 06:53:45 -0700 Subject: [SQL] create aggregate function 'count_bool( column_name, boolean )' > Hello, > I'd like to create a function called count_bool( column_name, boolean ) in > PostgreSQL. > > this function is similar to the count( column_name ) function but will only > count the trues or falses based on the other input parameter boolean. e.g. > if you pass in a 'true', all the trues will be counted but not the falses -- > it's the same but opposite if the 'false' was passed in. > > I'd like this aggregate function to be developed with the SQL language > instead of 'C' (for maintenance reasons). From the surface, it appears to > be an incredibly simple job only to find that it's difficult. > > In some respects, I can't believe this function doesn't exist in SQL > > so now I can create the statement > select distict product_id, count_bool(purchased, true), > count_bool(was_selected, true) from some_table group by product_id; > > instead of breaking the query into 3 seperate queries > > select distict product_id from some_table; > select count(purchased) from product_id where purchased = true; > select count(was_selected) from some_table where was_selected = true; > > Am I missing a detail with SQL based aggregate function development? > > Any help would be appreciated. > > Thanks! ------- End of Original Message -------
> so now I can create the statement > select distict product_id, count_bool(purchased, true), > count_bool(was_selected, true) from some_table group by product_id; > > instead of breaking the query into 3 seperate queries > > select distict product_id from some_table; > select count(purchased) from product_id where purchased = true; > select count(was_selected) from some_table where was_selected = true; > Am I missing a detail with SQL based aggregate function development? > Any help would be appreciated. how about: select product_id, ( select count(purchased) from some_table as A2 where purchased=true and A1.product_id=A2.product_id ) as TP, ( select count(selected) from some_table as A3 where purchased=true andA1.product_id=A3.product_id ) as TS from some_table as A1 group by product_id; Regards, Richard Broersma Jr.