2013-10-04 13 views
6

Die Struktur T_TABLE2 istWie GROUP BY in Firebird

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 

und ich verwende SQL-Editor in Firebird den Test meiner Abfrage zu verwenden. Th Abfrage ist

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

aber ich habe diesen Fehler in der Gruppe durch.

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

Antwort

6

Sie müssen von MySQL kommen. MySQL - IMHO irreführend, falsch und in einer magischen, unvorhersehbaren Weise - erlaubt es Ihnen, partielle GROUP BY Abfragen zu spezifizieren und die Datenbank-Engine versucht, aus dem Rest der Abfrage herauszufinden, welche Wert der nicht-gruppierten- nach gewünschten Spalten. Standard-SQL (Firebird und die meisten anderen RDBMSes), auf der anderen Seite, nicht; Es erfordert alle Nicht-Aggregatspalten, die in der Gruppe enthalten sein sollen, und alle Nichtgruppenspalten, die explizit angeben, die Zeile, die Sie möchten.

In Ihrem Fall sind die problematischen Spalten MEASUREMENT, LL und UL. Sie müssen angeben, MEASUREMENT, LL und UL Sie wollen (ja, auch wenn sie alle gleich sind; die Datenbank-Engine hat keine Möglichkeit, dies zu wissen oder zu garantieren), oder wenn Sie nach einem oder mehreren von gruppieren möchten die Spalten oder möglicherweise vergessen Sie zu aggregieren (wollten Sie die SUM?)


Beispiele für gültige Anfragen:

  1. Gruppe von allen Spalten (entsprechend einer SELECT DISTINCT):

    SELECT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT, LL, UL 
    
  2. Gruppe von MEASUREMENT als auch und gibt die MIN LL und MAX UL:

    SELECT TEST_DESC, MEASUREMENT, MIN(LL), MAX(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT 
    
  3. SUM nicht gruppierten Säulen:

    SELECT TEST_DESC, SUM(MEASUREMENT), SUM(LL), SUM(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC 
    
  4. Eine Kombination von Aggregaten:

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

Ich glaube nicht, seine "schwarze Magie" überhaupt, dauert es genau das, was Sie gruppieren nach, wenn das Feld eine Gruppenfunktion ist, dann läuft es normal, sonst dauert es zuerst oder zuletzt oder was auch immer, weil es Ihnen scheinbar egal ist. – Felype

2

Sie haben einige Aggregatfunktion anwenden (COUNT(), MIN(), MAX(), SUM(), ...) zu jedem der Spalt in SELECT Klausel, die nicht Teil GROUP BY ist.

Zum Beispiel könnte Ihre Abfrage aussehen

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

Eine weitere syntaktisch gültige Nutzungs eine Liste der unterschiedlichen Werte

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

die Wenn Sie

SELECT DISTINCT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 
von

äquivalent zu bekommen ist In Ihrer Frage wäre genauer gesagt, was genau Sie mit dieser Abfrage erreichen wollen de Die Antwort könnte Sie auf bestimmte Bedürfnisse ausgerichtet haben.

2

Während einige Datenbanken wie MySQL, nachsichtiger sind, in Standard-SQL, wenn Sie GROUP BY verwenden, muss die SELECT Liste enthält nur die Spalten durch und Aggregatfunktionen gruppiert sind (z SUM(), MAX()). Wenn Sie andere Spalten angeben dürfen, ist nicht vorhersehbar, aus welcher der Zeilen der gruppierten Spalte diese Spalten stammen - Sie können sogar eine Mischung von Spalten aus verschiedenen Zeilen erhalten.

Sie müssen also etwas tun:

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