如何显示计数的MAX

时间:2013-10-31 21:08:58

标签: sql oracle

您好我正在尝试编写一个返回该类别中具有最大兴趣人数的类别的查询(如果这样做有意义)

所以无论如何,这是我到目前为止的尝试..

SELECT category, MAX(catcount) FROM (
select category, catid, COUNT(id) AS catcount FROM (
SELECT  DISTINCT empinterest.id, INTERESTCATEGORY.CATID AS catid, INTERESTCATEGORY.category   FROM EMPINTEREST
INNER JOIN interest ON EMPINTEREST.INTID =  INTEREST.ID 
INNER JOIN interestcategory ON INTEREST.CATID = INTERESTCATEGORY.CATID
order by empinterest.id)
group by catid, category) GROUP BY category

我知道第一个子选择会给我一个类别和人们在该类别中的兴趣量,这就是为什么我试图在计数上运行最大值,但我认为group by子句正在停止返回的最大值。我曾试图使用HAVING子句,但似乎无法使语法正确,所以希望有人能够帮助我。提前谢谢!

这是表格,如果有帮助,如果有人需要澄清,我会提供它!

CREATE TABLE department
(
dptID INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL
);


CREATE TABLE interestcategory 
(
catID INT NOT NULL PRIMARY KEY,
category VARCHAR(30) NOT NULL
);


CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
title VARCHAR(10) NOT NULL,
fName VARCHAR(50) NOT NULL,
sName VARCHAR(50) NOT NULL,
jTitle VARCHAR(50) NOT NULL,
startDate DATE NOT NULL,
teamLead VARCHAR(50) NOT NULL,
employeeType VARCHAR(30) NOT NULL,
dptID INT NOT NULL REFERENCES department(dptID)
);


CREATE TABLE interest 
(
id INT NOT NULL PRIMARY KEY,
interest VARCHAR(50) NOT NULL,
catID INT NOT NULL REFERENCES interestcategory(catID)
  );
  CREATE TABLE empinterest 
(
id INT NOT NULL REFERENCES employee(id),
intID INT NOT NULL REFERENCES interest(id),
PRIMARY KEY (id, intID)
);

2 个答案:

答案 0 :(得分:1)

看看你如何能够做到这一点:

CREATE TABLE categories (
  category_id NUMBER,
  category_name VARCHAR2(20)
);

CREATE TABLE dep_table (
  category_id NUMBER
);

INSERT INTO categories VALUES (1, 'A');
INSERT INTO categories VALUES (2, 'B');
INSERT INTO categories VALUES (3, 'C');

INSERT INTO dep_table VALUES (1);
INSERT INTO dep_table VALUES (1);
INSERT INTO dep_table VALUES (1);
INSERT INTO dep_table VALUES (2);
INSERT INTO dep_table VALUES (3);
INSERT INTO dep_table VALUES (3);

COMMIT:

WITH
  main_query AS (
    SELECT ct.category_name, dt.category_id
      FROM categories ct
        JOIN dep_table dt ON (ct.category_id = dt.category_id)
  )
SELECT category_name, COUNT(1)
  FROM main_query
GROUP BY category_name
HAVING COUNT(1) = (SELECT MAX(COUNT(1)) FROM main_query GROUP BY category_name);

所以你的查询看起来像这样:

WITH
  main_query AS (
    SELECT
      DISTINCT
        empinterest.id,
        INTERESTCATEGORY.CATID AS catid,
        INTERESTCATEGORY.category
    FROM EMPINTEREST
      INNER JOIN interest ON EMPINTEREST.INTID =  INTEREST.ID 
      INNER JOIN interestcategory ON INTEREST.CATID = INTERESTCATEGORY.CATID
  )
SELECT category, COUNT(1)
  FROM main_query
GROUP BY catid, category
HAVING COUNT(1) = (SELECT MAX(COUNT(1)) FROM main_query GROUP BY catid, category);

答案 1 :(得分:0)

您可以执行子查询并选择顶行:

SELECT category, catcount FROM (
  select category, catid, COUNT(id) AS catcount 
  FROM (
    SELECT
      DISTINCT empinterest.id, 
      INTERESTCATEGORY.CATID AS catid,
      INTERESTCATEGORY.category
    FROM EMPINTEREST
      INNER JOIN interest ON EMPINTEREST.INTID =  INTEREST.ID 
      INNER JOIN interestcategory ON INTEREST.CATID = INTERESTCATEGORY.CATID
    order by empinterest.id)
  group by catid, category order by catcount desc)
WHERE ROWNUM <= 1

另见this question

唯一的麻烦就是当你希望能够获得满足count(id) = max(count(id))的所有行时,我猜你必须使用HAVING

相关问题