That is really neat about Oracle. The alternative in general is to use a subquery: SELECT avg(avg(sal)) FROM emp GROUP BY deptno; becomes select avg(the_avg) from (select avg(sal) from emp group b deptno) an_alias;
or with the_cte as (select avg(sal) x from emp group by deptno) select avg(x) from the_cte; On Thu, Feb 10, 2022 at 3:03 PM Julian Hyde <jhyde.apa...@gmail.com> wrote: > Some databases, e.g. Oracle, allow TWO levels of nesting: > > SELECT avg(sal) FROM emp GROUP BY deptno; > > AVG(SAL) > ======== > 1,566.67 > 2,175.00 > 2,916.65 > > SELECT avg(avg(sal)) FROM emp GROUP BY deptno; > > AVG(SUM(SAL)) > ============= > 9,675 > > The first level aggregates by department (returning 3 records), and the > second level computes the grand total (returning 1 record). But that is an > exceptional case. > > Generally, any expression in the SELECT or HAVING clause of an aggregate > query is either ‘before’ or ‘after’ aggregation. Consider > > SELECT t.x + 1 AS a, 2 + SUM(t.y + 3) AS b > FROM t > GROUP BY t.x > > The expressions “t.y” and “t.y + 3” occur before aggregation; “t.x”, “t.x > + 1”, “SUM(t.y + 3)” and “2 + SUM(t.y + 3)” occur after aggregation. SQL > semantics rely heavily on this stratification. Allowing an extra level of > aggregation would mess it all up. > > Julian > > > > > On Feb 10, 2022, at 9:45 AM, Justin Swanhart <greenl...@gmail.com> > wrote: > > > > This is a SQL limitation. > > > > mysql> select sum(1); > > +--------+ > > | sum(1) | > > +--------+ > > | 1 | > > +--------+ > > 1 row in set (0.00 sec) > > > > mysql> select sum(sum(1)); > > ERROR 1111 (HY000): Invalid use of group function > > > > On Thu, Feb 10, 2022 at 12:39 PM Gavin Ray <ray.gavi...@gmail.com> > wrote: > > > >> Went to test this query out and found that it can't be performed: > >> > >> SELECT > >> JSON_OBJECT( > >> KEY 'users' > >> VALUE JSON_ARRAYAGG( > >> JSON_OBJECT( > >> KEY 'name' VALUE "users"."name", > >> KEY 'todos' VALUE JSON_ARRAYAGG( > >> JSON_OBJECT( > >> KEY 'description' VALUE "todos"."description" > >> ) > >> ) > >> ) > >> ) > >> ) > >> FROM > >> "users" > >> LEFT OUTER JOIN > >> "todos" ON "users"."id" = "todos"."user_id"; > >> > >> Checking the source, seems this is a blanket policy, not a > >> datasource-specific thing. > >> From a functional perspective, it doesn't feel like it's much different > >> from JOINs > >> But I don't understand relational theory or DB functionality in the > least, > >> so I'm not fit to judge. > >> > >> Just curious why Calcite doesn't allow this > >> > >