Нельзя использовать Макс с количеством в SQL * Plus - PullRequest
0 голосов
/ 27 июня 2010

это мое заявление sql я получаю эту ошибку. но когда я использую только Макс для одного и без отображения других результатов, это работает. кто-нибудь может мне помочь

SELECT cat.CategoryName,sb.SubCategoryName,MAX((COUNT(bs.BookID))) 
FROM
  Category cat,SubCategory sb, Book_Subcategory bs 
WHERE cat.CategoryID = sb.CategoryID AND sb.SubCategoryID = bs.SubCategoryID 
GROUP BY cat.CategoryName, sb.SubCategoryName, bs.BookID;

ERROR at line 1:
ORA-00937: not a single-group group function

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

4 голосов
/ 27 июня 2010

SQL не разрешает агрегаты напрямую.

Однако, если вы записываете внутренний агрегат в подзапрос в предложении FROM (или используете предложение WITH и выражение общей таблицы, CTE),Вы можете достичь результата:

SELECT gc1.CategoryName, gc1.SubCategoryName, gc1.BookCount
  FROM (SELECT cat.CategoryName, sb.SubCategoryName,
               COUNT(bs.BookID) AS BookCount
          FROM Category AS cat
          JOIN SubCategory AS sb ON cat.CategoryID = sb.CategoryID
          JOIN Book_Subcategory AS bs ON sb.SubCategoryID = bs.SubCategoryID
         GROUP BY cat.CategoryName, sb.SubCategoryName
       ) AS gc1
 WHERE gc1.BookCount = (SELECT MAX(gc2.BookCount)
                          FROM (SELECT cat.CategoryName, sb.SubCategoryName,
                                       COUNT(bs.BookID) AS BookCount
                                  FROM Category AS cat
                                  JOIN SubCategory AS sb
                                       ON cat.CategoryID = sb.CategoryID
                                  JOIN Book_Subcategory AS bs
                                       ON sb.SubCategoryID = bs.SubCategoryID
                                 GROUP BY cat.CategoryName, sb.SubCategoryName
                                ) AS gc2
                        )

Это сложно, потому что он не использует CTE, и есть общее табличное выражение, которое должно быть записано дважды.

Использование CTEФорма (возможно, с синтаксическими ошибками):

WITH gc1 AS (SELECT cat.CategoryName, sb.SubCategoryName,
                    COUNT(bs.BookID) AS BookCount
               FROM Category AS cat
               JOIN SubCategory AS sb
                    ON cat.CategoryID = sb.CategoryID
               JOIN Book_Subcategory AS bs
                    ON sb.SubCategoryID = bs.SubCategoryID
              GROUP BY cat.CategoryName, sb.SubCategoryName
            )
SELECT gc1.CategoryName, gc1.SubCategoryName, gc1.BookCount
  FROM gc1
 WHERE gc1.BookCount = SELECT MAX(gc1.BookCount) FROM gc1);

Намного аккуратнее!

Вы можете смоделировать CTE с временной таблицей, если ваша СУБД позволяет легко их создавать.Например, IBM Informix Dynamic Server может использовать:

SELECT cat.CategoryName, sb.SubCategoryName,
       COUNT(bs.BookID) AS BookCount
  FROM Category AS cat
  JOIN SubCategory AS sb ON cat.CategoryID = sb.CategoryID
  JOIN Book_Subcategory AS bs ON sb.SubCategoryID = bs.SubCategoryID
 GROUP BY cat.CategoryName, sb.SubCategoryName
  INTO TEMP gc1;

SELECT gc1.CategoryName, gc1.SubCategoryName, gc1.BookCount
  FROM gc1
 WHERE gc1.BookCount = (SELECT MAX(gc1.BookCount) FROM gc1);

DROP TABLE gc1;  -- Optional: table will be deleted at end of session anyway

Учитывая следующие таблицы и данные, основной запрос (скопированный и вставленный из этого ответа) дал ожидаемый результат при запуске с IBM Informix.Dynamic Server 11.50.FC6 на MacOS X 10.6.4, а именно:

Non-Fiction    SQL Theory    4
Fiction        War           4

Это не доказывает, что оно «должно работать» при работе с Oracle - у меня нет Oracle и я не могу продемонстрироватьв любом случае.Это показывает, что есть хотя бы одна СУБД SQL, которая обрабатывает запрос без проблем.(Поскольку IDS не поддерживает предложение WITH и CTE, я не могу показать, работает ли эта формулировка.)

Схема

CREATE TABLE Category
(
    CategoryID INTEGER NOT NULL PRIMARY KEY,
    CategoryName VARCHAR(20) NOT NULL
);
CREATE TABLE SubCategory
(
    CategoryID INTEGER NOT NULL REFERENCES Category,
    SubCategoryID INTEGER NOT NULL PRIMARY KEY,
    SubCategoryName VARCHAR(20) NOT NULL
 );
CREATE TABLE Book_SubCategory
(
    SubCategoryID INTEGER NOT NULL REFERENCES SubCategory,
    BookID INTEGER NOT NULL PRIMARY KEY
);

Данные

INSERT INTO Category VALUES(1, 'Fiction');
INSERT INTO Category VALUES(2, 'Non-Fiction');

INSERT INTO SubCategory VALUES(2, 1, 'SQL Theory');
INSERT INTO SubCategory VALUES(2, 2, 'Mathematics');
INSERT INTO SubCategory VALUES(1, 3, 'Romance');
INSERT INTO SubCategory VALUES(1, 4, 'War');

INSERT INTO Book_SubCategory VALUES(1, 10);
INSERT INTO Book_SubCategory VALUES(2, 11);
INSERT INTO Book_SubCategory VALUES(3, 12);
INSERT INTO Book_SubCategory VALUES(3, 13);
INSERT INTO Book_SubCategory VALUES(4, 14);
INSERT INTO Book_SubCategory VALUES(1, 15);
INSERT INTO Book_SubCategory VALUES(1, 16);
INSERT INTO Book_SubCategory VALUES(2, 17);
INSERT INTO Book_SubCategory VALUES(1, 18);
INSERT INTO Book_SubCategory VALUES(3, 19);
INSERT INTO Book_SubCategory VALUES(4, 20);
INSERT INTO Book_SubCategory VALUES(4, 21);
INSERT INTO Book_SubCategory VALUES(4, 22);
0 голосов
/ 27 июня 2010

Я думаю, что ошибка в предложении GROUP BY (bs.BookID там не принадлежит):

SELECT cat.CategoryName,sb.SubCategoryName,MAX(COUNT(bs.BookID)) 
FROM Category cat,SubCategory sb, Book_Subcategory bs 
WHERE cat.CategoryID =sb.CategoryID AND sb.SubCategoryID=bs.SubCategoryID 
GROUP BY cat.CategoryName,sb.SubCategoryName;

Кстати, пробелы (и знаки препинания) - ваши друзья. Не ленитесь об этом.

...