簡體   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