2010-04-21 129 views
3

我有一個名爲「名稱」,「城市」和「職業」的三個填充列的表。 我想在同一個表中創建一個包含具有相同職業的人數的新列。SQL計數查詢與多列分組

"Name" | "City" | "Occupation" 
------------------------------ 
Amy | Berlin | Plumber 
Bob | Berlin | Plumber 
Carol | Berlin | Lawyer 
David | London | Plumber 

我想有一個包含一個表:

"Name" | "City" | "Occupation" | "Number" 
--------------------------------------- 
Amy | Berlin | Plumber  | 2 
Bob | Berlin | Plumber  | 2 
Carol | Berlin | Lawyer  | 1 
David | London | Plumber  | 1 

如何創建新列的SQL查詢有什麼樣子的?我想實際上在數據庫中創建一個新的列,以便以後訪問。

+0

我閱讀標題奇蹟爲什麼你的詢問正在摸索......認真! – thecoshman 2010-04-21 10:00:11

+0

在上面的表格中,行是水平的,列是垂直的。例如「amy - berlin - plumber」是一排,而「Name」,「City」和「Occupation」是列。 – 2010-04-21 11:15:53

回答

1

簡單的自聯接:

SELECT t0.Name, t0.City, t0.Occupation, COUNT(*) AS Number 
FROM sometable AS t0 
JOIN sometable AS t1 ON t1.Occupation=t0.Occupation 
GROUP BY t0.Name, t0.City, t0.Occupation 

如果Name是主鍵,您可以只用單獨代替組,因爲其他列會對它的功能依賴。當然Name通常不會是一個非常好的主鍵。

(如果你想的其他人做的工作,而不是總的數量,您可能需要COUNT(*)-1目前還不清楚;在你的榜樣的數字對不上任何一種方式)

如果您必須改變你的架構(除非你是你需要它絕對肯定我不會推薦這種denormalisation的;見註釋),你可以用一個UPDATE做它加入到邁克爾的子查詢:

ALTER TABLE sometable ADD COLUMN Number INTEGER NOT NULL; 
UPDATE sometable AS t0 JOIN (
    SELECT Occupation, COUNT(*) AS Number 
    FROM sometable 
    GROUP BY Occupation 
) AS t1 ON t1.Occupation=t0.Occupation 
SET t0.Number= t1.Number; 
+0

謝謝,但我想將Number寫入行,因爲它可能會花費很多 – Christian 2010-04-21 10:07:20

+2

不成熟的優化:在你需要的時候不要改變你的模式,通過'Occupation'上的索引,這個速度會非常快,我可以做一個類似的自連接,並且 - 在大約5秒的網頁論壇數據庫中查詢500k個帖子,Michael的查詢速度更快(儘管對於LIMITed結果,速度更慢);這最好取決於數據庫中的確切數據,但是合適的索引將會很快 – bobince 2010-04-21 10:11:27

+0

我在我的數據庫中有20,000,000個條目,我正在尋找100,000個查詢,我需要性能。 – Christian 2010-04-21 11:39:26

3
select tbl.name, tbl.city, tbl.occupation, x.number 
from tbl 
join 
(
    select occupation, count(*) as number 
    from tbl 
    group by occupation 
) as x on x.occupation = tbl.occupation