0

こんにちは、そのカテゴリに関心を持つ人の数が最大のカテゴリを返すクエリを作成しようとしています (それが理にかなっている場合)

とにかく、これまでのところ私の試みはここにあります..

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)
);
4

2 に答える 2

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);
于 2013-10-31T21:47:55.423 に答える
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

この質問も参照してください。

唯一の問題は、 を満たすすべての行を取得できるようにしたい場合count(id) = max(count(id))ですHAVING

于 2013-10-31T21:34:28.020 に答える