SQL 不能使用从 group by 中的子查询返回的列

Posted

技术标签:

【中文标题】SQL 不能使用从 group by 中的子查询返回的列【英文标题】:SQL doesn't work using a column returns from subquery in group by 【发布时间】:2018-11-20 16:19:54 【问题描述】:

我需要运行如下查询,但它无法识别 SHOWNDATE。为什么会这样?

查询被简化为清晰:

select  PYNAME,
        SHOWNDATE=(SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID),
        count(PYSUBJECTID)
from B
group by PYNAME,
         SHOWNDATE

【问题讨论】:

【参考方案1】:

我认为在 Select 子句中写为 AS SHOWNDATE SHOWNDATE = 不对。

select
PYNAME,
(SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID) AS SHOWNDATE,
count(PYSUBJECTID)
from B
group by PYNAME,SHOWNDATE

【讨论】:

【参考方案2】:

这是一个基于 Scott 架构的示例,展示了如何做到这一点:

SQL> select b.deptno,
  2         (select max(a.sal) from emp a where b.deptno = a.deptno) as showsal,
  3         count(b.empno)
  4  from emp b
  5  group by b.deptno;

    DEPTNO    SHOWSAL COUNT(B.EMPNO)
---------- ---------- --------------
        30       2850              6
        20       3000              3
        10       5000              3

SQL>

或者,应用于您的查询:

select  b.pyname,
        (select max(a.outcometime) from a where a.id = b.id) showndate,
        count(b.pysubjectid)
from b
group by b.pyname;

不要忘记为所有列应用表别名!

【讨论】:

【参考方案3】:

ALIAS(在本例中为 SHOWNDATE)不是一个有效的标识符,但它适用于来自子查询的结果集。使用别名是为了方便...没有人希望将“SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID”作为列名。

select 
PYNAME
,SHOWNDATE
,COUNT
from (
select   PYNAME
    ,(SELECT MAX(OUTCOMETIME) FROM A where A.ID=B.ID) SHOWNDATE
    ,count(PYSUBJECTID) COUNT
from B
 Group by PYNAME
)
group by  PYNAME
     ,SHOWNDATE
     ,COUNT

【讨论】:

以上是关于SQL 不能使用从 group by 中的子查询返回的列的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中使用带有group by的子查询?

如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?

使用SQL语言了解Django ORM中的分组(group by)和聚合(aggregation)查询

从多个表中创建 Sql Server VIEW GROUPing BY,选择子查询作为别名

神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列

与 group by 一起使用的 sql.xml 中的查询是不是正确?