Re: count and group by question - Mailing list pgsql-hackers

From Hannu Krosing
Subject Re: count and group by question
Date
Msg-id 1024517240.2189.17.camel@rh72.home.ee
Whole thread Raw
In response to Re: count and group by question  ("Dann Corbit" <DCorbit@connx.com>)
List pgsql-hackers
On Thu, 2002-06-20 at 02:02, Dann Corbit wrote:
> > -----Original Message-----
> > From: ryan@paymentalliance.net [mailto:ryan@paymentalliance.net]
> > Sent: Wednesday, June 19, 2002 12:19 PM
> > To: pgsql-hackers@postgresql.org
> > Subject: [HACKERS] count and group by question
> > 
> > 
> > I have a query which contains both a group by and a count, e.g:
> > 
> > SELECT
> >    to_char(pa_shopping_cart.delivery_date, 'FMMM/FMDD/YY') AS 
> > delivery_date,
> >    pa_products.product_name AS product_name,
> >    pa_orders.order_state AS state,
> >    count(*) AS count
> > FROM
> >   pa_shopping_cart,
> >   pa_products,
> >   pa_orders
> > WHERE
> >   pa_shopping_cart.order_id = pa_orders.order_id AND
> >   pa_shopping_cart.product_id = pa_products.product_id
> > GROUP BY
> >   pa_shopping_cart.delivery_date,
> >   pa_products.product_name,
> >   pa_orders.order_state
> > ORDER BY
> >   pa_shopping_cart.delivery_date, pa_products.product_name;
> > 
> > 
> > This query is really handy because it gives me the count of each
> > product grouping by delivery within each possible order state.
> > 
> > Here's the question - I would like to get the count of how 
> > many tuples are
> > returned total.  With most queries, count(*) works great for 
> > this purpose,
> > however I need something that will give me the total count of tuples
> > returned even when there is a grouping.
> > 
> > Any ideas?
> 
> Run two queries, the second with no group by.


Something like this should also work:

SELECT  to_char(pa_shopping_cart.delivery_date, 'FMMM/FMDD/YY') AS
delivery_date,  pa_products.product_name AS product_name,  pa_orders.order_state AS state,  count(*) AS count
FROM pa_shopping_cart, pa_products, pa_orders
WHERE pa_shopping_cart.order_id = pa_orders.order_id AND pa_shopping_cart.product_id = pa_products.product_id
GROUP BY pa_shopping_cart.delivery_date, pa_products.product_name, pa_orders.order_state 
UNION
SELECT  NULL,NULL,NULL, countfrom (
select count(*) AS count
FROM pa_shopping_cart, pa_products, pa_orders
WHERE pa_shopping_cart.order_id = pa_orders.order_id AND pa_shopping_cart.product_id = pa_products.product_id
) total 

ORDER BY pa_shopping_cart.delivery_date, pa_products.product_name;

make the NULL,NULL,NULL part something else to get it sorted where you
want.

> 
> To make a really nice looking report with this kind of stuff, you can
> use Crystal reports with the ODBC driver.  Then you can set as many
> break columns as you like.
> 
> Which reminds me, it would be nice to have the cube/rollup sort of OLAP
> stuff from SQL99 ISO/IEC 9075-2:1999 (E) in PostgreSQL:

It seems like simple ROLLUP and () (i.e. grandTotal) would be doable by
current executor and plans, i.e. sort and then aggregate, just add more
aggregate fields and have different start/finalize conditions

CUBE and GROUPING SETS will probably need another kind of execution
plan, perhaps some kind of hashed tuple list.

> 7.9 <group by clause>
> Function
> Specify a grouped table derived by the application of the <group by
> clause> to the result of the
> previously specified clause.
> Format
> <group by clause> ::=
> GROUP BY <grouping specification>
> <grouping specification> ::=
> <grouping column reference>
> | <rollup list>
> | <cube list>
> | <grouping sets list>
> | <grand total>
> | <concatenated grouping>
> <rollup list> ::=
> ROLLUP <left paren> <grouping column reference list> <right paren>
> <cube list> ::=
> CUBE <left paren> <grouping column reference list> <right paren>
> <grouping sets list> ::=
> GROUPING SETS <left paren> <grouping set list> <right paren>
> <grouping set list> ::=
> <grouping set> [ { <comma> <grouping set> }... ]
> <concatenated grouping> ::=
> <grouping set> <comma> <grouping set list>
> <grouping set> ::=
> <ordinary grouping set>
> | <rollup list>
> | <cube list>
> | <grand total>
> <ordinary grouping set> ::=
> <grouping column reference>
> | <left paren> <grouping column reference list> <right paren>
> <grand total> ::= <left paren> <right paren>
> <grouping column reference list> ::=
> <grouping column reference> [ { <comma> <grouping column reference> }...
> ]
> <grouping column reference> ::=
> <column reference> [ <collate clause> ]
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly




pgsql-hackers by date:

Previous
From: Peter Eisentraut
Date:
Subject: Re: [Fwd: [PATCHES] contrib/showguc (was Re: revised sample
Next
From: "Dann Corbit"
Date:
Subject: Re: count and group by question