2013-10-04 5 views
6

La struttura del T_TABLE2 èCome utilizzare 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 

e lo uso editor di SQL in Firebird test mia domanda. interrogazione Th è

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

ma ho ottenuto questo errore nel raggruppamento.

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

risposta

6

Devi essere provenienti da MySQL. MySQL - IMHO in modo fuorviante, errato e in un modo nero-magicky, imprevedibile - consente di specificare query parziali GROUP BY e il motore del database cerca di capire dal resto della query quale valore non raggruppato- dalle colonne che vuoi SQL standard (Firebird e la maggior parte degli altri RDBMS), d'altra parte, no; richiede che qualsiasi colonna non aggregata sia contenuta nel gruppo per, e qualsiasi colonna non raggruppata per specificare esplicitamente quale riga si desidera.

Nel tuo caso, le colonne incriminate sono MEASUREMENT, LL e UL. È necessario specificare cheMEASUREMENT, LL, e UL si vuole (sì, anche se sono tutti uguali, il motore di database non ha modo di sapere o garantire tale), o se si vuole di gruppo da uno o più dei le colonne o forse hai dimenticato di aggregare (Volevi il SUM?)


Esempi di query validi:

  1. Gruppo di tutte le colonne (equivalente a un SELECT DISTINCT):

    SELECT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT, LL, UL 
    
  2. Gruppo per MEASUREMENT come bene e restituire il MIN LL e MAX UL:

    SELECT TEST_DESC, MEASUREMENT, MIN(LL), MAX(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT 
    
  3. SUM colonne non raggruppate:

    SELECT TEST_DESC, SUM(MEASUREMENT), SUM(LL), SUM(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC 
    
  4. Una combinazione di aggregati:

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

Non credo che la sua "magia nera" a tutti, ci vuole solo quello raggruppato per, se il campo è una funzione di gruppo, viene eseguito normalmente, altrimenti richiede prima o l'ultima o qualsiasi altra cosa perché apparentemente non ti interessa. – Felype

2

si deve applicare una certa funzione di aggregazione (COUNT(), MIN(), MAX(), SUM(), ...) per ciascuna delle colonne in SELECT clausola che non fanno parte della GROUP BY.

Ad esempio la query potrebbe sembrare

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

Un altro utilizzo sintatticamente valido è quello di ottenere un elenco di valori distinti

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

che è equivalente di

SELECT DISTINCT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 

Se sarebbe stato più specifico nella tua domanda su cosa esattamente stai cercando di ottenere con questa query en la risposta potrebbe aver affrontato particolari esigenze.

2

Mentre alcuni database, come MySQL, sono più favorevole, in SQL standard quando si utilizza GROUP BY, l'elenco SELECT deve contenere solo le colonne essendo raggruppate per e funzioni di aggregazione (ad esempio SUM(), MAX()). Se ti è stato permesso di specificare altre colonne, è imprevedibile quale delle righe della colonna raggruppata provengano da queste colonne: potresti persino ottenere un mix di colonne da righe diverse.

quindi è necessario fare qualcosa di simile:

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