PDA

View Full Version : Hoi ve loi ORA-00979: not a GROUP BY expression



pkhai
06-03-2003, 13:57
Minh co sql nhu sau:
select a,b,c from table where table.a='xyz' group by a

nhung khi chay bi loi: ORA-00979: not a GROUP BY expression

Neu minh sua lai:
select a,b,c from table where table.a='xyz' group by a,b,c
hoac:
select a,max(b),max(c) .......
thi khong bao loi nhu vay nua

Minh khong biet tai sao
cac cao thu oracle chi giao voi.

xbacala
06-03-2003, 18:20
Bạn nên đọc lại phần cơ bản về mệnh đề SELECT với GROUP BY !

Một nguyên tắc quan trọng là tất cả các field trong SELECT list phải nằm trong GROUP BY ngoại trừ các field tham gia vào các phép tính trên group. Do đó:

select a,b,c from table where table.a='xyz' group by a
>> Sai vì b và c nằm trong SELECT list, không tham gia vào phép tính trên nhóm mà lại không nằm trong GROUP BY

select a,b,c from table where table.a='xyz' group by a,b,c
>>OK vì a,b,c đều nằm trong SELECT list và GROUP BY

select a,max(b),max(c) from table where table.a='xyz' group by a
>> OK ví lúc này b và c nằm trong SELECT list với toán tử trên nhóm MAX nên không cần xuất hiện trong GROUP BY

Qui tắc này là của ngôn ngữ SQL chuẩn chứ không riêng gì Oracle.

Hy vọng là bạn hiểu !

pkhai
07-03-2003, 09:42
Minh da hieu cach giai thich cua ban. Nhung van con thac mac :
Neu minh phat bieu:
select a,b,c from table where table.a='xyz' group by a

Trong Visual fox 6 voi du lieu la DBF thi OK khong bao loi.

xbacala
07-03-2003, 10:24
FOX thì mình không biết. Nhưng mà với các CSDL như SQL Server, Oracle, Access, DB2 thì nó sẽ báo lỗi.

pkhai
07-03-2003, 11:00
Vay co cach nao khac phuc khong.
Boi vi neu liet ke het select list trong group thi dai qua
con neu them max,min.. thi trong mot so truong hop lay du lieu
bi sai ket qua.
Xcabala giup voi

ctr_alt_del
07-03-2003, 16:10
Trong Oracle để lấy một khoảng dữ liệu nào đó có thể dùng cột giả rownum.
Chẳng hạn
select table_name from user_tables where
rownum <10


tuy nhiên nếu có mệnh để order by thì ta chỉ thu được sắp xếp trong rownum trở lại mà không phải là 20 giá trị đầu của kết quả sắp xếp.

lcnguyen
17-07-2003, 18:28
Using
select table_name from user_tables where
rownum <10

is not the correct way to fix that problem. Try this:
select distinct a, b, c from table
where table.a = 'a'

Use select distinct will return a distinct record for columns a, b, and c. And you are rite, if using max(b), max(c), only return the maximum values of each column b, and c. Other values associated with column a, but not a max value will not be return.
Hope it will help you.

lacmatnguoiyeu
04-09-2004, 15:00
bạn chỉ dùng được GROUP BY khi trong select list có các loại của Group function đi kèm như COUNT(), AVG(), MAX(), MIN().. và column mà bạn muốn display
Còn nếu nói theo ý muốn của bạn thì cứ liệt kê trong select list thôi, đâu cần GROUP BY , dùng thêm ORDER BY thì được .