در مورد توابعی مانند تابع soundex چون به ازای هر رکورد یک result برمیگردونند پس نوشتن کوئریهایی مانند زیر مشکلی ندارد:
SELECT SOUNDEX(NAME), NAME FROM T2;
SOUN NAME
----- ------------
A256 MOHAMMAD
J130 MAHDI
S500 MOHSEN
C540 FARZAD
A400 EHSAN
ولی در مورد تابعهای تک RESULT ای مثل SUM مشکلاتی ایجاد میشود.
مثال:
CREATE TABLE T5(AGE NUMBER, NAME VARCHAR2(20));
INSERT INTO T5 VALUES (50, 'HAMID');
INSERT INTO T5 VALUES (20, 'AKBAR');
INSERT INTO T5 VALUES (10, 'HOSSEIN');
INSERT INTO T5 VALUES (30, 'HOSSEIN');
INSERT INTO T5 VALUES (15, 'AKBAR');
خب خیلی راحت میتونیم SUM ,AVG, ... رو برای این جدول حساب کنیم:
SELECT SUM(AGE) FROM T5;
SUM(AGE)
--------
125
SELECT AVG(AGE) FROM T5;
AVG(AGE)
--------
25
مشکل
اگر بخواهیم فیلد دیگری رو در کوئریمون بیاریم مثل فیلد NAME اوراکل به ما اجازه این کار رو نمیده چون این فانکشن SINGLE RESULT است.
SELECT AVG(AGE), NAME FROM T5;
*
ERROR at line 1:
ORA-00937: not a single-group group function.
راهحل
برای حل این مشکل وقتی میخواهیم به صورت گروهی از توابع تک result ای استفاده کنیم باید از group by (شاخصبندی) استفاده کنیم:
SELECT AVG(AGE), NAME FROM T5 GROUP BY NAME;
AVG(AGE) NAME
-------- -----------
20 HOSSEIN
50 HAMID
17.5 AKBAR
چون ما درکل ۲ تا HOSSEIN داشتیم پس میانگشن سن این ۲ تا رو مینویسه که 20 هستش (40/2) ۲ تا NAME نمیاره و یکی رو میاره و عمل مورد نظر رو انجام میده.
نکته: به همین علت ما برای فانکشنهای تک RESULTای از GROUP BY استفاده میکنیم چون تک RESULT رو باید بر یک مبنایی در برای نمایش گروهی برگردونه.