9

T_TABLE2的结构是

ID INT
TBL1_ID INT
TESTER VARCHAR
LOT_ID VARCHAR
GRP VARCHAR
SITE_NUM INT
TEST_NUM VARCHAR
TEST_DESC VARCHAR
MEASUREMENT DOUBLE PRECISION
UNIT VARCHAR
LL DOUBLE PRECISION
UL DOUBLE PRECISION
STATUS VARCHAR

我在 firebird 中使用 SQL 编辑器测试我的查询。查询是

SELECT TEST_DESC, MEASUREMENT, LL, UL 
FROM T_TABLE2 
GROUP BY TEST_DESC

但我在 group by 中遇到了这个错误。

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
4

3 回答 3

14

您必须来自 MySQL。MySQL - 恕我直言,误导,错误,并且以一种黑色魔法,不可预测的方式 - 允许您指定部分GROUP BY查询,并且数据库引擎尝试从查询的其余部分中找出您的非分组列的哪个值想。另一方面,标准 SQL(Firebird 和大多数其他 RDBMS)没有;它要求任何非聚合列都包含在 group by 中,并且任何非 group-by 列都需要明确指定您想要的行

在您的情况下,有问题的列是MEASUREMENTLLUL。您需要指定您想要 MEASUREMENTLLUL(是的,即使它们都是相同的;数据库引擎无法知道或保证这一点),或者如果您想按一个或多个列进行分组,或者可能是您忘记聚合(你想要SUM吗?)


有效查询示例:

  1. 按所有列分组(相当于 a SELECT DISTINCT):

    SELECT TEST_DESC, MEASUREMENT, LL, UL
    FROM T_TABLE2
    GROUP BY TEST_DESC, MEASUREMENT, LL, UL
    
  2. 也分组MEASUREMENT并返回MINLL 和MAXUL:

    SELECT TEST_DESC, MEASUREMENT, MIN(LL), MAX(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC, MEASUREMENT
    
  3. SUM非分组列:

    SELECT TEST_DESC, SUM(MEASUREMENT), SUM(LL), SUM(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC
    
  4. 集合的组合:

    SELECT TEST_DESC, COUNT(DISTINCT MEASUREMENT), SUM(LL), MAX(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC
    
于 2013-10-04T01:56:49.493 回答
4

虽然某些数据库(如 MySQL)更为宽松,但在标准 SQL 中,当您使用 时GROUP BYSELECT列表必须只包含被分组的列和聚合函数(例如SUM()MAX())。如果您被允许指定其他列,则无法预测这些列将来自分组列的哪一行——您甚至可能会得到来自不同行的列的混合。

因此,您需要执行以下操作:

SELECT TEST_DESC, MAX(MEASUREMENT) MEASUREMENT, MAX(LL) LL, MAX(UL) UL 
FROM T_TABLE2 
GROUP BY TEST_DESC
于 2013-10-04T01:55:33.717 回答
3

您必须对子句中不属于COUNT().MIN()MAX()SUM()SELECTGROUP BY

例如,您的查询可能看起来像

SELECT TEST_DESC, MAX(MEASUREMENT) MAX_MEASUREMENT, MAX(LL) MAX_LL, MAX(UL) MAX_UL
  FROM T_TABLE2 
 GROUP BY TEST_DESC

另一个语法上有效的用法是获取不同值的列表

SELECT TEST_DESC, MEASUREMENT, LL, UL 
  FROM T_TABLE2 
 GROUP BY TEST_DESC, MEASUREMENT, LL, UL 

这相当于

SELECT DISTINCT TEST_DESC, MEASUREMENT, LL, UL 
  FROM T_TABLE2 

如果您在问题中更具体地了解您想要通过此查询实现什么,那么答案可能已经满足了您的特定需求。

于 2013-10-04T01:55:01.957 回答