2013-10-04 22 views
6

Cấu trúc của T_TABLE2Làm thế nào để sử dụng GROUP BY trong 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 

và tôi sử dụng biên tập SQL trong Firebird kiểm tra truy vấn của tôi. Th truy vấn là

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

nhưng tôi gặp lỗi này theo từng nhóm.

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

Trả lời

6

Bạn phải đến từ MySQL. MySQL - IMHO gây hiểu nhầm, không chính xác, và theo một cách đen tối, không thể đoán trước được - cho phép bạn chỉ định một phần truy vấn GROUP BY và công cụ cơ sở dữ liệu cố gắng tìm ra phần còn lại của truy vấn giá trị của nhóm không được nhóm theo cột bạn muốn. SQL tiêu chuẩn (Firebird và hầu hết các RDBMS khác), mặt khác, không; nó yêu cầu bất kỳ cột không tổng hợp nào được chứa trong nhóm theo và bất kỳ cột không theo nhóm nào để chỉ định rõ ràng hàng nào bạn muốn.

Trong trường hợp của bạn, các cột vi phạm là MEASUREMENT, LLUL. Bạn cần chỉ định MEASUREMENT, LLUL bạn muốn (có, ngay cả khi chúng giống nhau; cơ sở dữ liệu không có cách nào để biết hoặc đảm bảo điều này) hoặc nếu bạn muốn nhóm theo một hoặc nhiều các cột hoặc có thể bạn quên tổng hợp (Bạn có muốn SUM không?)


Ví dụ về truy vấn hợp lệ:

  1. Nhóm của tất cả các cột (tương đương với một SELECT DISTINCT):

    SELECT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT, LL, UL 
    
  2. Đoàn tự do MEASUREMENT cũng và trả lại MIN LL và MAX UL:

    SELECT TEST_DESC, MEASUREMENT, MIN(LL), MAX(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT 
    
  3. SUM phi nhóm cột:

    SELECT TEST_DESC, SUM(MEASUREMENT), SUM(LL), SUM(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC 
    
  4. Sự kết hợp giữa uẩn:

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

Tôi không nghĩ rằng "ma thuật đen" của nó ở tất cả, nó chỉ mất gì bạn nhóm lại, nếu trường là một hàm nhóm thì nó chạy bình thường, nếu không nó sẽ mất đầu tiên hoặc cuối cùng hoặc bất cứ điều gì bởi vì bạn dường như không quan tâm. – Felype

2

Bạn cần phải áp dụng một số chức năng tổng hợp (COUNT(), MIN(), MAX(), SUM() ...) cho mỗi cột trong SELECT khoản mà không phải là một phần của GROUP BY.

Ví dụ truy vấn của bạn có thể trông như

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

Một cách sử dụng cú pháp hợp lệ là để có được một danh sách các giá trị khác biệt

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

đó là tương đương với

SELECT DISTINCT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 

Nếu bạn sẽ cụ thể hơn trong câu hỏi của bạn về chính xác những gì bạn đang cố gắng đạt được với truy vấn này vi câu trả lời có thể giải quyết các nhu cầu cụ thể của bạn.

2

Trong khi một số cơ sở dữ liệu, chẳng hạn như MySQL, không nghiêm khắc, trong SQL tiêu chuẩn khi bạn sử dụng GROUP BY, danh sách SELECT chỉ phải chứa các cột được nhóm lại theo và chức năng tổng hợp (ví dụ SUM(), MAX()). Nếu bạn được phép chỉ định các cột khác, không thể đoán trước được những hàng nào của cột được nhóm mà các cột này sẽ xuất phát - thậm chí bạn có thể nhận được kết hợp các cột từ các hàng khác nhau.

Vì vậy, bạn cần phải làm điều gì đó như:

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