Как использовать GROUP BY в firebird

структура T_TABLE2 is

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

и я использую редактор SQL в firebird, чтобы проверить мой запрос. Го запроса составляет

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

3 ответов


вы должны исходить из MySQL. MySQL-IMHO вводит в заблуждение, неправильно и черным-магическим, непредсказуемым способом - позволяет указать partial GROUP BY запросы и компонент database engine пытается выяснить из остальной части запроса , который значение не сгруппированных по столбцам, которые вы хотите. Стандартный SQL (Firebird и большинство других RDBMSes), с другой стороны, не делает; он требует, чтобы любые неагрегатные столбцы содержались в group by, и любые столбцы, не являющиеся group-by чтобы явно указать какой ряд вы хотите.

в вашем случае оскорбительные столбцы MEASUREMENT, LL и UL. Вам нужно указать , который MEASUREMENT, LL и UL вы хотите (да, даже если они все одинаковы; компонент database engine не может знать или гарантировать это), или если вы хотите сгруппировать по одному или нескольким столбцам или, возможно, вы забыли агрегировать (вы хотите SUM?)


примеры допустимых запросов:

  1. группировать по всем столбцам (эквивалентно SELECT DISTINCT):

    SELECT TEST_DESC, MEASUREMENT, LL, UL
    FROM T_TABLE2
    GROUP BY TEST_DESC, MEASUREMENT, LL, UL
    
  2. группы по MEASUREMENT а также и вернуть MIN LL и MAX UL:

    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
    

в то время как некоторые базы данных, такие как 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

вы должны применить некоторую агрегатную функцию (COUNT(),MIN(), MAX(), SUM(),...) к каждому из столбцов в SELECT предложение, которое не является частью GROUP 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 

если бы Вы были более конкретными в своем вопросе о том, что именно вы пытаетесь достичь с помощью этого запроса тогда ответ мог бы адресовать вам конкретные потребности.