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

问题描述:

我正在使用Firebird SQL。下面提到的查询返回4行,如图所示。错误:选择列表中的表达式无效(未包含在聚合函数或GROUP BY子句中)

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

我希望它仅仅返回1(一)像

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 

的错误信息是:

Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)

+0

你尝试SELECT DISTINCT – gherkin

+0

我也不能够让DISTINCT工作与我的查询:( –

+0

由于错误消息说,您需要列表提供给中使用任何列' “GROUP BY”表达式中的SELECT列表(不是聚合) – oals

使用GROUP BY使发动机记录为你。要进行分组,你必须给RDBMS建议每个列,它应该做什么。

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

另外发现:在你的情况,你通过EPS_ID,这是每行中唯一尝试组。因此,按该列分组的分组将返回所有行,因为没有任何内容需要分组。要对记录进行分组,他们必须具有与相同的值。

了解如何使用正确的,明确的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; 

注:我也建议你使用表缩写表的别名。所以,epTBLEXAMPLANNER_S_MSB而不是a。任意表别名使查询很难遵循。

+0

谢谢@戈登,但它仍然显示我4行,如附图所示 –

尝试

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 
+1

虽然这段代码可能有助于解决问题,但它并没有解释_why_和/或_how_它回答了这个问题。提供这种附加背景将显着提高其长期教育价值。请[编辑]您的答案以添加解释,包括适用的限制和假设。 –