如何在火鸟中使用 GROUP BY

Posted

技术标签:

【中文标题】如何在火鸟中使用 GROUP BY【英文标题】:How to use GROUP BY in firebird 【发布时间】:2013-10-10 21:38:23 【问题描述】:

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).

【问题讨论】:

【参考方案1】:

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

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


有效查询示例:

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

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

    也按MEASUREMENT 分组并返回MIN LL 和MAX UL:

    SELECT TEST_DESC, MEASUREMENT, MIN(LL), MAX(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC, MEASUREMENT
    

    SUM 非分组列:

    SELECT TEST_DESC, SUM(MEASUREMENT), SUM(LL), SUM(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC
    

    聚合的组合:

    SELECT TEST_DESC, COUNT(DISTINCT MEASUREMENT), SUM(LL), MAX(UL)
    FROM T_TABLE2
    GROUP BY TEST_DESC
    

【讨论】:

我根本不认为它的“黑魔法”,它只需要你分组的内容,如果该字段是一个组函数,那么它会正常运行,否则它首先或最后或者其他什么,因为你显然不在乎。【参考方案2】:

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

所以你需要做类似的事情:

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

【讨论】:

【参考方案3】:

您必须对SELECT 子句中不属于GROUP BY 的每个列应用一些聚合函数(COUNT()MIN()MAX()SUM()、...)。

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

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 

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

【讨论】:

以上是关于如何在火鸟中使用 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

如何在DynamoDB中使用group by?

如何在 laravel 中使用 concat 和 group by?

如何在 GROUP BY 和 ORDER BY 中使用多列但只有一列

如何在 symfony 存储库中使用 group by

如何在 SQL 中使用 group by 运行 sum?

如何在 JPQL 中使用 GROUP BY 和 UNION