2009-10-05 29 views
96

Tôi nhận được ORA-00.979 với các truy vấn sau đây:ORA-00.979 không phải là một nhóm bởi biểu

SELECT cr.review_sk, cr.cs_sk, cr.full_name, 
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", 
cs.cs_id, cr.tracking_number 
from review cr, cs, fact cf 
where cr.cs_sk = cs.cs_sk 
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%' 
and row_delete_date_time is null 
and cr.review_sk = cf.review_wk (+) 
and cr.fact_type_code (+) = 183050 
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number 
ORDER BY cs.cs_id, cr.full_name; 

tôi không thể tìm thấy bất kỳ ví dụ mà có cả GROUP BY và ORDER BY khoản trong cùng một truy vấn. Tôi đã cố gắng loại bỏ từng lĩnh vực từ từng nhóm một, nhưng vẫn nhận được cùng một lỗi.

Trả lời

166

Bạn phải đặt tất cả các cột của SELECT trong GROUP BY hoặc sử dụng các chức năng trên chúng mà nén kết quả cho một giá trị duy nhất (như MIN, MAX hoặc SUM).

Một ví dụ đơn giản để hiểu lý do tại sao điều này xảy ra: Hãy tưởng tượng bạn có một cơ sở dữ liệu như thế này:

FOO BAR 
0 A 
0 B 

và bạn chạy SELECT * FROM table GROUP BY foo. Điều này có nghĩa là cơ sở dữ liệu phải trả về một hàng duy nhất do cột đầu tiên 0 hoàn thành GROUP BY nhưng hiện tại có hai giá trị là bar để chọn. Bạn mong đợi kết quả nào - A hoặc B? Hoặc cơ sở dữ liệu nên trả lại nhiều hơn một hàng, vi phạm hợp đồng của GROUP BY?

+0

ngay cả những thứ nằm trong mệnh đề ORDER BY? Tôi không có hai người trong GROUP BY của tôi. – Theresa

+6

Không, bạn không cần phải đặt chúng theo thứ tự của bạn theo khoản – Xaisoft

+2

Tôi đã thử thêm hai cột trong ORDER BY vào GROUP BY. Điều đó hiệu quả. Cảm ơn! – Theresa

13

Bao gồm trong mệnh đề GROUP BY tất cả các biểu thức SELECT không phải là đối số hàm nhóm.

2

Oracle quá xấu có những giới hạn như thế này. Chắc chắn, kết quả cho một cột không có trong GROUP BY sẽ là ngẫu nhiên, nhưng đôi khi bạn muốn điều đó. Silly Oracle, bạn có thể làm điều này trong MySQL/MSSQL.

NHƯNG có một công việc xung quanh cho Oracle:

Trong khi dòng sau không làm việc

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A; 

Bạn có thể lừa Oracle với một số của 0 như sau, để giữ cho cột của bạn trong phạm vi , nhưng không phải nhóm của nó (giả sử đây là những con số, nếu không sử dụng CONCAT)

SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt 
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A); 
+0

@GlennFromIowa cho bảng giả của tôi không được xác định nghiêm ngặt ở trên và tôi không còn làm việc cho một công ty có 11g nữa, tôi không thể cung cấp ví dụ tốt hơn, mặc dù đó là vấn đề khi tôi thử nghiệm lần cuối. –

+1

Chỉ cần ra khỏi tò mò một ví dụ về khi nào bạn sẽ muốn có một kết quả ngẫu nhiên? Tôi không thể nghĩ ra bất kỳ lý do nào bạn muốn nhóm bởi FOO và nhận được một hàng ngẫu nhiên cho BAR. –

1

nhóm này bởi được sử dụng để tổng hợp nên dữ liệu của tôi, tùy thuộc vào chức năng tổng hợp, và khác hơn là bạn cần phải đặt cột hoặc cột mà bạn cần nhóm.

ví dụ:

select d.deptno, max(e.sal) from emp e, dept d where e.deptno = d.deptno group by d.deptno;

này sẽ dẫn đến các phòng ban lương tối đa.

Bây giờ nếu chúng ta bỏ qua d.deptno từ nhóm theo mệnh đề, nó sẽ cho cùng một lỗi.

1

Bạn nên làm như sau:

SELECT cr.review_sk, 
     cr.cs_sk, 
     cr.full_name, 
     tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", 
     cs.cs_id, 
     cr.tracking_number 
from review cr, cs, fact cf 
where cr.cs_sk = cs.cs_sk 
     and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%' 
     and row_delete_date_time is null 
     and cr.review_sk = cf.review_wk (+) 
     and cr.fact_type_code (+) = 183050 
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name 
ORDER BY cs.cs_id, cr.full_name; 
0

Cùng một lỗi cũng đến khi UPPER hoặc LOWER từ khóa không được sử dụng trong cả hai nơi trong chọn biểu và nhóm của biểu thức.

sai: -

select a , count(*) from my_table group by UPPER(a) . 

phải: -

select UPPER(a) , count(*) from my_table group by UPPER(a) . 
1

Nếu bạn mò mẫm nhờ bao gồm GROUP BY khoản, bất kỳ biểu hiện trong SELECT, mà không phải là chức năng nhóm (hoặc chức năng tổng hợp hoặc cột tổng hợp) chẳng hạn như COUNT, AVG, MIN, MAX, SUM, v.v. (List of Aggregate functions) phải có trong mệnh đề GROUP BY.

Ví dụ (đúng cách) (ở đây employee_id không phải là chức năng nhóm (cột không tổng hợp), vì vậy nó phải xuất hiện trong GROUP BY. Ngược lại, sum (lương) là một chức năng nhóm (cột tổng hợp), vì vậy nó không được yêu cầu để xuất hiện trong mệnh đề GROUP BY.

SELECT employee_id, sum(salary) 
    FROM employees 
    GROUP BY employee_id; 

Ví dụ (một cách sai lầm) (ở đây employee_id không phải là chức năng nhóm và nó không xuất hiện trong GROUP BY khoản, mà sẽ dẫn đến sự ORA-00.979 Lỗi:

SELECT employee_id, sum(salary) 
    FROM employees; 

Để khắc phục bạn cần làm một các nội dung sau:

  • Bao gồm tất cả biểu thức không tổng hợp được liệt kê trong SELECT khoản trong GROUP BY khoản
  • Remove nhóm (tổng hợp) chức năng từ điều khoản SELECT.
Các vấn đề liên quan