错误:选择列表中的表达式无效(未包含在聚合函数或GROUP BY子句中)

时间:2016-09-29 10:44:13

标签: sql group-by firebird

我正在使用Firebird SQL。下面提到的查询返回4行,如图所示。

    SELECT a.EPS_ID,b.C_NAME,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM 
    TBLEXAMPLANNER_S_MSB a, 
    TBLCLASS_MSB b, 
    TBLACADEMICYEAR_MSB c, 
    TBLSUBJECTS_MSB d, 
    TBLEXAMTYPE_MSB e
WHERE 
    a.EPS_CLASS_ID=b.C_ID 
AND a.EPS_SESSION_ID=c.AY_ID 
AND a.EPS_SUB_ID=d.S_ID 
AND a.EPS_PE_ID=e.E_ID

click to view image

我希望它只返回一行(如

EPS_ID     C_NAME    AY_YR_NAME   S_NAME   E_NAME
---------------------------------------------------
7          5         2016-2017    English  FA1 

我正在使用以下查询,但它不起作用。

SELECT a.EPS_ID,MAX(b.C_NAME) AS XT,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM 
    TBLEXAMPLANNER_S_MSB a, 
    TBLCLASS_MSB b, 
    TBLACADEMICYEAR_MSB c, 
    TBLSUBJECTS_MSB d, 
    TBLEXAMTYPE_MSB e
WHERE 
    a.EPS_CLASS_ID=b.C_ID 
AND a.EPS_SESSION_ID=c.AY_ID 
AND a.EPS_SUB_ID=d.S_ID 
AND a.EPS_PE_ID=e.E_ID
GROUP BY a.EPS_ID,d.S_NAME

错误消息是:

  

选择列表中的表达式无效(不包含在   聚合函数或GROUP BY子句)

3 个答案:

答案 0 :(得分:4)

GROUP BY的使用使引擎成为您的记录。要进行分组,您必须为RDBMS提供每个列的建议,以及它应该做什么。

  • 分组吗? - >将列添加到GROUP BY-Clause
  • 不分组吗? - >好的,还有什么?
    • 忽略该列?从你的select-clause中删除它
    • 总结一下? - >使用SUM(mycol)
    • 其他聚合函数可以在documentation
    • 中找到

此外:在您的情况下,您尝试按EPS_ID分组,这在每行中都是唯一的。因此,该列的分组将返回所有行,因为没有任何内容可以分组。要对记录进行分组,他们必须具有相同的值。

答案 1 :(得分:0)

学习使用正确的,明确的JOIN语法。

您的问题是所有未加聚合的列需要位于GROUP BY

SELECT a.EPS_ID, MAX(b.C_NAME) AS XT, c.AY_YR_NAME, d.S_NAME, e.E_NAME
FROM TBLEXAMPLANNER_S_MSB a JOIN 
     TBLCLASS_MSB b
     ON a.EPS_CLASS_ID = b.C_ID JOIN
     TBLACADEMICYEAR_MSB c
     ON a.EPS_SESSION_ID = c.AY_ID JOIN
     TBLSUBJECTS_MSB d
     ON a.EPS_SUB_ID = d.S_ID JOIN 
     TBLEXAMTYPE_MSB e
     ON a.EPS_PE_ID = e.E_ID
GROUP BY a.EPS_ID, c.AY_YR_NAME, d.S_NAME, e.E_NAME;

注意:我还建议您对表别名使用表缩写。因此,ep代替TBLEXAMPLANNER_S_MSB代替a。任意表别名使查询很难遵循。

答案 2 :(得分:-1)

尝试

SELECT a.EPS_ID,c.AY_YR_NAME,d.S_NAME,e.E_NAME,MAX(b.C_NAME) AS XT ...
GROUP BY 1,2,3,4