Как использовать 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
а также и вернуть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
в то время как некоторые базы данных, такие как 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
если бы Вы были более конкретными в своем вопросе о том, что именно вы пытаетесь достичь с помощью этого запроса тогда ответ мог бы адресовать вам конкретные потребности.