Re: A subselect in an aggregate

Поиск
Список
Период
Сортировка
От Bryan White
Тема Re: A subselect in an aggregate
Дата
Msg-id 00ad01bfdfa1$3d64ad00$2dd260d1@arcamax.com
обсуждение исходный текст
Ответ на A subselect in an aggregate  ("Bryan White" <bryan@arcamax.com>)
Ответы Re: A subselect in an aggregate  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-sql

> Bryan White wrote:
> >
> > This statement works:
> > select date, (select sum(qty * price) from orderdetail d where d.orderid
=
> > orders.orderid) from orders
> >
> > But when I try to do something like this:
> >
> > select date, sum(select sum(qty * price) from orderdetail d where
d.orderid
> > = orders.orderid) from orders group by date
> >
> > I get ERROR: parser: parse error at or near "select"
> >
> > Is there a way to apply an agregate function to a subselect like this?
>
> Avoiding the question, I'm wondering if this simpler form wouldn't be
> what you're after?
>
> select o.date, sum(d.qty * d.price)
> from orderdetail d, orders o
> where d.orderid = o.orderid
> group by o.date

This is very slow (acutally I killed it after about 5 minutes):
select o.date,sum(d.qty * d.price) from orderdetail d,orders o where o.date
= '6/1/2000' group by o.date;
Explained:
Aggregate  (cost=0.00..41074641.24 rows=120300337 width=20) ->  Group  (cost=0.00..38067132.80 rows=1203003374
width=20)      ->  Nested Loop  (cost=0.00..35059624.37 rows=1203003374 width=20)             ->  Index Scan using
iorddate3on orders o
 
(cost=0.00..6917.34 rows=1808 width=4)             ->  Seq Scan on orderdetail d  (cost=0.00..12733.78
rows=665378 width=16)

Doing a squential scan of orderdetail inside a loop seems to be what kills
it.

This is quick (it takes a couple of seconds):
select o.date,(select sum(od.qty * od.price) from orderdetail od where
od.orderid = o.orderid) from orders o where o.date = '6/1/2000';
Explained:
Index Scan using iorddate3 on orders o  (cost=0.00..6917.34 rows=1808
width=8) SubPlan   ->  Aggregate  (cost=45.24..45.24 rows=1 width=16)         ->  Index Scan using iodid on orderdetail
od (cost=0.00..45.21
 
rows=11 width=16)

I suppose I can do my own grouping on the result data but I would like to
avoid that if I could.  Which brings me back to the original question:  Is
there a way to apply an aggregate function to a subselect?





В списке pgsql-sql по дате отправления:

Предыдущее
От: Ed Loehr
Дата:
Сообщение: Re: pg_dump problem
Следующее
От: Tom Lane
Дата:
Сообщение: Re: A subselect in an aggregate