2013-02-28 85 views
3

我是一個相對的SQL初學者,我不完全知道如何問我在問什麼(所以我也不完全知道如何搜索幫助它)。SQL SELECT與GROUP BY,指向組

我想使用SELECT語句,該語句使用GROUP BY子句按特定屬性進行分組,並且同時返回到該組所選的行。有沒有辦法做到這一點? (我正在使用,FWIW,SQLite3,但我認爲這更多是一個通用SQL語法的問題。)

我有一個表​​其中我有關於人和家庭的數據。每一行都是一個人,每個人都被分爲一到十幾個家庭。

每個家庭中的一個人(通常是第一個人,由uid)是戶主,並且具有head列設置。我想GROUP BYhousehold_id,並且還選擇組的每個成員誰是「頭」uid。有沒有辦法用一個陳述來做到這一點?

這是我有:

SELECT DISTINCT household_id, 
    COUNT(uid) AS members /* The number of members in each household; it works */, 
    (SELECT uid FROM "group" WHERE head == 1) /* Only I don't know how to do this */ 
    FROM population GROUP BY household_id; 

我想這樣的事情,並沒有給我什麼,我想:

SELECT DISTINCT household_id, 
    COUNT(uid) AS members, 
    (SELECT uid FROM population WHERE household_id == household_id AND head == 1) /* <-- here */ 
    FROM population GROUP BY household_id; 

但是,這當然是挑選的第一行中household_idhousehold_id;即表格中的第一行。我該如何參考household_id這個特定組中的DISTINCT

任何提示?提前致謝。

回答

4

試試這個,

SELECT household_id, 
     COUNT(uid) AS members, 
     MAX(CASE WHEN head = 1 THEN uid ELSE NULL END) headID 
FROM population 
GROUP BY household_id; 
+1

謝謝!這很有效,但爲什麼,我仍然在撓頭。讓我直截了當地說:對於組中的每個成員,您的子句將「head_id」設置爲1(如果「head」== 1)或NULL。然後它找到該組的MAX,並且由於組中的每個人除了頭部之外都是NULL,它只會選擇1的人(NULL接收到底部)。 – LonelyPilgrim 2013-02-28 17:10:53

+1

你是對的。我不必解釋一下'COUNT()',因爲我知道你已經知道了。你對這一行感到困惑:'MAX(case when head = 1 THEN uid ELSE NULL END)'right?請記住,您正在通過'household_id'彙總記錄,因此它會在搜索「head = 1」的所有記錄上運行。如果找到了,那麼某個列的值就是'uid',否則'null'。爲了完全理解,執行這個查詢,'SELECT household_id,CASE when head = 1 THEN uid ELSE NULL END as HeadID FROM population'。 – 2013-02-28 17:16:01

+1

謝謝;是的,這是我不確定的路線。我現在明白了。 – LonelyPilgrim 2013-02-28 17:18:21

1

你可能已經在正確的軌道上

SELECT DISTINCT household_id, 
COUNT(uid) AS members, 
(SELECT uid FROM population WHERE household_id == household_id AND head == 1) /* <-- here */ 
FROM population GROUP BY household_id; 

,但你需要別名人口表,因爲它在查詢中使用兩次。

SELECT DISTINCT household_id, 
COUNT(uid) AS members, 
(SELECT uid FROM population gr_head WHERE pop.household_id = gr_head.household_id AND head == 1) /* <-- here */ 
FROM population pop GROUP BY household_id; 
+0

謝謝!這也起作用,並且確切地說我想說的是什麼。我仍然在思考走樣;這有很大幫助。 – LonelyPilgrim 2013-02-28 17:15:32