考慮以下表格:
TABLE PAPER // it contains IDs of scientific papers and IDs of the scientists who wrote them
╔═══════════╦═════════════╗
║ PaperID ║ ScientistID ║
╠═══════════╬═════════════╣
║ 10 ║ 1 ║
╠═══════════╬═════════════╣
║ 11 ║ 1 ║
╠═══════════╬═════════════╣
║ 12 ║ 2 ║
╠═══════════╬═════════════╣
║ 13 ║ 3 ║
╚═══════════╩═════════════╝
TABLE SCIENTISTS // it contains IDs of scientists and their names
╔═════════════╦════════════════╗
║ ScientistID ║ ScientistName ║
╠═════════════╬════════════════╣
║ 1 ║ Tikola Nesla ║
╠═════════════╬════════════════╣
║ 2 ║ Carie Murie ║
╠═════════════╬════════════════╣
║ 3 ║ Nsaac Iewton ║
╚═════════════╩════════════════╝
我正在尋找一個 SELECT 查詢來列印科學家的名字以及他們發表科學論文的次數,所需的結果應該是這樣的:
CountOfPapersPerScientist ScientistName
------------------------- -------------
2 Tikola Nesla
1 Carie Murie
1 Nsaac Iewton
我能夠使用這個列印每個科學家的論文數量:
SELECT COUNT(PaperID) FROM PAPER GROUP BY ScientistID;
但這不起作用:
SELECT COUNT(PaperID), ScientistName FROM PAPER, SCIENTISTS WHERE SCIENTISTS.ScientistID=PAPER.ScientistID GROUP BY PAPER.ScientistID;
ERROR at line 1:
ORA-00979: not a GROUP BY expression
你能解釋一下什么是“GROUP BY 運算式”以及為什么我的查詢不是一個?并請提出替代查詢,謝謝!
uj5u.com熱心網友回復:
這是你需要的,簡單的分組和加入:
select s.ScientistName, count(p.paperId) CountOfPapersPerScientist
from paper p
join SCIENTISTS s on p.ScientistID = s.ScientistID
group by s.ScientistName
uj5u.com熱心網友回復:
你能解釋一下什么是“GROUP BY 運算式”以及為什么我的查詢不是一個?
當您使用GROUP BY子句時,子句中的所有列都SELECT需要是:
- 列于
GROUP BY條款中;或者 - 在聚合函式纏繞(如
SUM,COUNT,LISTAGG等等)。
您在子句中擁有GROUP BY s.ScientistId和使用既未在子句中列出也未包含在聚合函式中的子句。ScientistNameSELECTGROUP BY
你需要的是:
SELECT MAX(s.ScientistName) AS ScientistName,
count(p.paperId) CountOfPapersPerScientist
FROM paper p
INNER JOIN scientists s
On p.ScientistID = s.ScientistID
GROUP BY
s.ScientistId;
或者
SELECT s.ScientistName,
count(p.paperId) CountOfPapersPerScientist
FROM paper p
INNER JOIN scientists s
On p.ScientistID = s.ScientistID
GROUP BY
s.ScientistId, s.ScientistName;
因為這兩者都將按科學家識別符號的主鍵進行分組。
如果您只按名稱分組,那么您會將碰巧同名的兩位不同科學家的論文數量聚合在一起,這可能不是您想要的,您需要確保按每個人獨特的內容分組科學家(他們的名字可能不是唯一的)。
例如,如果您有資料:
CREATE TABLE Scientists (ScientistId PRIMARY KEY, ScientistName, DateOfBirth) AS
SELECT 1, 'Alice', DATE '2000-01-01' FROM DUAL UNION ALL
SELECT 2, 'Beryl', DATE '1990-01-01' FROM DUAL UNION ALL
SELECT 3, 'Carol', DATE '1980-01-01' FROM DUAL UNION ALL
SELECT 4, 'Alice', DATE '1970-01-01' FROM DUAL;
CREATE TABLE paper (PaperID, ScientistID) AS
SELECT 10, 1 FROM DUAL UNION ALL
SELECT 11, 1 FROM DUAL UNION ALL
SELECT 12, 2 FROM DUAL UNION ALL
SELECT 13, 3 FROM DUAL UNION ALL
SELECT 14, 4 FROM DUAL;
ALTER TABLE paper ADD CONSTRAINT paper__scientistid__fk FOREIGN KEY (ScientistId) REFERENCES Scientists (ScientistId);
然后上面的查詢都輸出:
科學家名 數位論文科學家 愛麗絲 2 綠柱石 1 頌歌 1 愛麗絲 1
每個獨特的科學家都有一行(即使兩個有相同的名字)。
但是,天真地僅分組ScientistName會輸出:
科學家名 數位論文科學家 愛麗絲 3 綠柱石 1 頌歌 1
這是錯誤的,因為有兩個不同的科學家命名Alice。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368556.html
上一篇:使用UITapGestureRecognizer點擊后如何保護UIView
下一篇:帶條件的資料透視表
