2013-10-04 63 views
6

T_TABLE2結構是如何使用GROUP BY在火鳥

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編輯器。 Th查詢是

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

但我得到了這個錯誤在組中。

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

回答

6

您必須從MySQL的到來。 MySQL的 - 恕我直言誤導,不正確,並在黑magicky,unpredictible排序的方式 - 允許您指定部分GROUP BY查詢和數據庫引擎嘗試從其餘查詢其中的值非grouped-弄清楚按你想要的列。另一方面,標準SQL(Firebird和大多數其他RDBMS)不會;它需要被包含在GROUP BY在任何非聚合列,任何非組由列明確指定要哪一行

在你的情況下,違規的列是MEASUREMENT,LLUL。你需要指定哪個MEASUREMENT,LLUL你想要的(是的,即使它們都是一樣的;數據庫引擎無法知道或保證這一點),或者如果你想分組一個或多個列或可能你忘了聚合(你想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 
    
+0

我不認爲它的 「黑魔法」 的說法,它只是需要什麼你分組,如果該字段是一個組功能,那麼它運行正常,否則它需要第一或最後或什麼,因爲你顯然不在乎。 – Felype

2

你必須塗抹一些聚合函數(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 

如果您在你的問題中更具體的是關於你試圖用這個查詢來達到的目標答案可能解決了你的特殊需求。

2

雖然一些數據庫,如MySQL,當您使用GROUP BY較爲寬鬆,在標準SQL中,SELECT列表必須只包含列正在和聚合函數(例如SUM()MAX())分組。如果你被允許指定其他列,它是不可預測的,其分組列這些列將來自各行的 - 你甚至可以從不同的行列的組合。

所以,你需要做的是這樣的:

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