Как использовать 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?)
примеры допустимых запросов:
-
группировать по всем столбцам (эквивалентно
SELECT DISTINCT):SELECT TEST_DESC, MEASUREMENT, LL, UL FROM T_TABLE2 GROUP BY TEST_DESC, MEASUREMENT, LL, UL -
группы по
MEASUREMENTа также и вернутьMINLL иMAXUL: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
в то время как некоторые базы данных, такие как 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
если бы Вы были более конкретными в своем вопросе о том, что именно вы пытаетесь достичь с помощью этого запроса тогда ответ мог бы адресовать вам конкретные потребности.