Обсуждение: problem with subselect
Hi,
I have this :
SELECT date_trunc('month', f.date_creation) as mois, sum(f.montant_ttc / d.taux) as facture, (SELECT
sum(f2.montant_ttc/ d2.taux) as facture2 FROM facture AS f2 JOIN devise AS d2 USING (id_devise) WHERE
date_trunc('month',f2.date_creation) <= date_trunc('month', f.date_creation))
FROM facture AS f JOIN devise AS d USING (id_devise)
GROUP BY date_trunc('month', f.date_creation)
which does not work... telling me that
"Sub-SELECT uses un-GROUPed attribute f.date_creation from outer query"
Which is not really true, but some way is...
What I want is to get the sum of the month, and the sum of the month and
the previous.
If someone has a clue, something, anything... :)
--
Mathieu Arnold
>
> I have this :
>
> SELECT date_trunc('month', f.date_creation) as mois,
> sum(f.montant_ttc / d.taux) as facture,
> (SELECT sum(f2.montant_ttc / d2.taux) as facture2
> FROM facture AS f2 JOIN devise AS d2 USING (id_devise)
> WHERE date_trunc('month', f2.date_creation)
> <= date_trunc('month', f.date_creation))
> FROM facture AS f JOIN devise AS d USING (id_devise)
> GROUP BY date_trunc('month', f.date_creation)
>
> which does not work... telling me that
>
> "Sub-SELECT uses un-GROUPed attribute f.date_creation from outer
query"
> Which is not really true, but some way is...
>
> What I want is to get the sum of the month, and the sum of the month
and
> the previous.
>
> If someone has a clue, something, anything... :)
>
Try
... GROUP BY mois ;
Regards, Christoph
--En cette belle journée de vendredi 7 mars 2003 14:15 +0100,
-- Christoph Haller <ch@rodos.fzk.de> écrivait :
|>
|> I have this :
|>
|> SELECT date_trunc('month', f.date_creation) as mois,
|> sum(f.montant_ttc / d.taux) as facture,
|> (SELECT sum(f2.montant_ttc / d2.taux) as facture2
|> FROM facture AS f2 JOIN devise AS d2 USING (id_devise)
|> WHERE date_trunc('month', f2.date_creation)
|> <= date_trunc('month', f.date_creation))
|> FROM facture AS f JOIN devise AS d USING (id_devise)
|> GROUP BY date_trunc('month', f.date_creation)
|>
|> which does not work... telling me that
|>
|> "Sub-SELECT uses un-GROUPed attribute f.date_creation from outer
| query"
|> Which is not really true, but some way is...
|>
|> What I want is to get the sum of the month, and the sum of the month
| and
|> the previous.
|>
|> If someone has a clue, something, anything... :)
|>
| Try
| ... GROUP BY mois ;
Already tried, not working either.
--
Mathieu Arnold
> |> SELECT date_trunc('month', f.date_creation) as mois,
> |> sum(f.montant_ttc / d.taux) as facture,
> |> (SELECT sum(f2.montant_ttc / d2.taux) as facture2
> |> FROM facture AS f2 JOIN devise AS d2 USING (id_devise)
> |> WHERE date_trunc('month', f2.date_creation)
> |> <=3D date_trunc('month', f.date_creation))
> |> FROM facture AS f JOIN devise AS d USING (id_devise)
> |> GROUP BY date_trunc('month', f.date_creation)
> |>=20
> |> which does not work... telling me that
> |>=20
> |> "Sub-SELECT uses un-GROUPed attribute f.date_creation from outer
> | query"
> |> Which is not really true, but some way is...
> |>=20
> |> What I want is to get the sum of the month, and the sum of the
month
> | and
> |> the previous.
> |>=20
> |> If someone has a clue, something, anything... :)
> |>=20
> | Try
> | ... GROUP BY mois ;
>
> Already tried, not working either.
>
I should have had a closer look:
The WHERE clause is causing the error.
I can't see any quick solution, but what often helped me is
First try to word the query as a view and do the GROUPing then on the
view.
Regards, Christoph
Mathieu,
> SELECT date_trunc('month', f.date_creation) as mois,
> sum(f.montant_ttc / d.taux) as facture,
> (SELECT sum(f2.montant_ttc / d2.taux) as facture2
> FROM facture AS f2 JOIN devise AS d2 USING (id_devise)
> WHERE date_trunc('month', f2.date_creation)
> <= date_trunc('month', f.date_creation))
> FROM facture AS f JOIN devise AS d USING (id_devise)
> GROUP BY date_trunc('month', f.date_creation)
> "Sub-SELECT uses un-GROUPed attribute f.date_creation from outer query"
> Which is not really true, but some way is...
Hmmm ... this looks like a minor parser bug. What Postgres version are you
using?
> What I want is to get the sum of the month, and the sum of the month and
> the previous.
>
> If someone has a clue, something, anything... :)
Sure. Try putting the sub-select in the FROM clause, instead of the SELECT;
that should un-confuse the parser about the grouping.
--
Josh Berkus
Aglio Database Solutions
San Francisco
Josh Berkus <josh@agliodbs.com> writes:
>> "Sub-SELECT uses un-GROUPed attribute f.date_creation from outer query"
>> Which is not really true, but some way is...
> Hmmm ... this looks like a minor parser bug.
No, it's operating as designed. Note the comments in CVS tip
parse_agg.c:
* NOTE: we recognize grouping expressions in the main query, but only* grouping Vars in subqueries. For example, this
willbe rejected,* although it could be allowed:* SELECT* (SELECT x FROM bar where y = (foo.a +
foo.b))* FROM foo* GROUP BY a + b;* The difficulty is the need to account for different sublevels_up.*
Thisappears to require a whole custom version of equal(), which is* way more pain than the feature seems worth.
Previous versions implemented the check for ungrouped vars a little
differently, but the net effect was the same. (Given that SQL99 allows
only a simple column reference as a GROUP BY element, this isn't a spec
violation, merely a limitation on how far we are willing to extend the
spec.)
There are a number of straightforward ways to rewrite the query to avoid
this, but I can't help wondering whether the basic approach isn't wrong.
The subselect seems an ugly and inefficient way to do it, because it's
re-executing the entire join for each group ... but I can't quite put
my finger on a better way ...
regards, tom lane