如何在firebird中使用GROUP BY

aii*_*pee 7 sql firebird group-by

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
Run Code Online (Sandbox Code Playgroud)

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

SELECT TEST_DESC, MEASUREMENT, LL, UL 
FROM T_TABLE2 
GROUP BY TEST_DESC
Run Code Online (Sandbox Code Playgroud)

但我在分组中得到了这个错误.

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).
Run Code Online (Sandbox Code Playgroud)

lc.*_*lc. 11

你必须来自MySQL.MySQL的-恕我直言误导,不正确,并在黑magicky,unpredictible排序的方式-允许您指定部分GROUP BY查询和数据库引擎尝试从其余查询找出其中的价值不分组,由你列想.另一方面,标准SQL(Firebird和大多数其他RDBMS)不会; 它要求任何非聚合列包含在组中,并且任何非group-by列都要显式指定所需的.

在你的情况下,违规列MEASUREMENT,LLUL.你需要指定哪个 MEASUREMENT,哪个LLUL你想要的(是的,即使它们都是相同的;数据库引擎无法知道或保证这一点),或者你想要按一个或多个列分组,或者你可能忘记聚合了(你想要SUM吗?)


有效查询的示例:

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

    SELECT TEST_DESC, MEASUREMENT, LL, UL
    FROM T_TABLE2
    GROUP BY TEST_DESC, MEASUREMENT, LL, UL
    
    Run Code Online (Sandbox Code Playgroud)
  2. 分组MEASUREMENT并返回MINLL和MAXUL:

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

    SELECT TEST_DESC, SUM(MEASUREMENT), SUM(LL), SUM(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC
    
    Run Code Online (Sandbox Code Playgroud)
  4. 聚合的组合:

    SELECT TEST_DESC, COUNT(DISTINCT MEASUREMENT), SUM(LL), MAX(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC
    
    Run Code Online (Sandbox Code Playgroud)


Bar*_*mar 5

虽然某些数据库(例如 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
Run Code Online (Sandbox Code Playgroud)