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: