繁体   English   中英

SQL查询 - 计数 - 最大

[英]SQL Query - count - max

我无法设法查询问题。 我有三张桌子

CREATE TABLE institute (
    iid INT PRIMARY KEY,
    sign VARCHAR(127) UNIQUE, 
    city VARCHAR(127) NOT NULL,
    area INT CHECK (area>0));

CREATE TABLE desease (
    did INT PRIMARY KEY,
    name VARCHAR(127) UNIQUE,
    level INT CHECK (level>0));

CREATE TABLE studies (
    did INT,
    iid INT,
    FOREIGN KEY (did) REFERENCES desease (did),
    FOREIGN KEY (iid) REFERENCES institute (iid),
    PRIMARY KEY (iid,did));

我的问题是:由单位从里斯本数量最多哪些deseases的名称(里斯本beeng的cityinstitute )。 这是我想出来的,但它没有给我正确的答案。

SELECT DISTINCT D.name, MAX(I.iid)
  FROM desease D, studies S
  JOIN institute I ON (S.iid = I.iid)
 WHERE I.city = 'Lisboa' AND D.did = S.did
 GROUP BY D.nome
HAVING COUNT(I.iid) = MAX(I.city)

举个例子:想象一下5个研究所al = city ='Lisbon'和iid A,B,C,D,E(仅用于演示目的,我知道类型是INT); 5名疾病的名称分别为Z,X,N,V,M。

现在假设由研究所A,B,C(以任何顺序)研究Z,X和M,通过D(1 inst。)研究desease N,并且通过E(仅一个)研究desease V. 因此,任何里斯本研究所研究的最大数量是3(A,B和C所有研究3 deseases)所以表格看起来像这样

Z - 3
X - 3
M - 3

编辑:我设法找到了办法。 这是我提出的查询

SELECT DISTINCT D.name, COUNT(*) AS C
FROM desease D, studies E, institute I
WHERE I.iid = E.iid AND D.did = E.did AND I.city = "Lisboa"
GROUP BY D.name
HAVING C >= ALL (
SELECT COUNT(*)
FROM desease D, studies E, institute I
WHERE I.iid = E.iid AND D.did = E.did AND I.cidade = "Lisboa"
GROUP BY D.name

);

我不太了解结构/问题,但我确实看到你正在混合连接并且有一个交叉连接会增加recrds的数量。

SELECT DISTINCT D.name, MAX(I.iid)
FROM desease D
INNER JOIN  studies S ON D.iid=S.Did
INNER JOIN  institute I ON (S.iid = I.iid)
WHERE I.city = 'Lisboa' AND D.did = S.did
GROUP BY D.nome
HAVING COUNT(I.iid) = MAX(I.city)

只是粗略猜测你需要什么:

SELECT stu.iid, COUNT(*) AS nstudies
FROM studies stu, institute ins
WHERE stu.iid=ins.iid
AND ins.city='Lisboa'
GROUP BY stu.iid
ORDER BY nstudies DESC;

这应该会给你一份里斯本学院的名单和他们所做的研究数量。

SELECT stu.did, COUNT(*) AS ninst
FROM studies stu, institute ins, disease dis
WHERE stu.iid=ins.iid
AND stu.did=dis.did
AND ins.city='Lisboa'
GROUP BY stu.did
ORDER BY ninst DESC;

这给你一个desease列表和Lisboa instutitues的数量。

不幸的是,你的问题留下了很多猜测你需要什么的空间 - 也许你应该添加一些示例数据和预期结果。

这将返回一份在里斯本拥有一所研究所的疾病名单,从里斯本研究所数量最多的研究所开始下降:

SELECT D.name, COUNT(*) as numberOfInstitutes
FROM desease D
INNER JOIN studies S ON D.did=S.did
INNER JOIN institute I ON (S.iid = I.iid)
WHERE I.city = 'Lisbon'
GROUP BY D.did
ORDER BY COUNT(*) desc

如果您只需要具有最多机构的那个并且您需要desease表中的其余列,则可以执行此操作(在Sql Server中):

SELECT TOP 1 D.* 
FROM desease D
INNER JOIN
(
    SELECT D.did, COUNT(*) as numberOfInstitutes
    FROM desease D
    INNER JOIN studies S ON D.did=S.did
    INNER JOIN institute I ON (S.iid = I.iid)
    WHERE I.city = 'Lisbon'
    GROUP BY D.did
) as tblCount on tblCount.did = D.did
ORDER BY numberOfInstitutes desc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM