我是一個相對的SQL初學者,我不完全知道如何問我在問什麼(所以我也不完全知道如何搜索幫助它)。SQL SELECT與GROUP BY,指向組
我想使用SELECT
語句,該語句使用GROUP BY
子句按特定屬性進行分組,並且同時返回到該組所選的行。有沒有辦法做到這一點? (我正在使用,FWIW,SQLite3,但我認爲這更多是一個通用SQL語法的問題。)
我有一個表其中我有關於人和家庭的數據。每一行都是一個人,每個人都被分爲一到十幾個家庭。
每個家庭中的一個人(通常是第一個人,由uid
)是戶主,並且具有head
列設置。我想GROUP BY
列household_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_id
是household_id
;即表格中的第一行。我該如何參考household_id
這個特定組中的DISTINCT
?
任何提示?提前致謝。
謝謝!這很有效,但爲什麼,我仍然在撓頭。讓我直截了當地說:對於組中的每個成員,您的子句將「head_id」設置爲1(如果「head」== 1)或NULL。然後它找到該組的MAX,並且由於組中的每個人除了頭部之外都是NULL,它只會選擇1的人(NULL接收到底部)。 – LonelyPilgrim 2013-02-28 17:10:53
你是對的。我不必解釋一下'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
謝謝;是的,這是我不確定的路線。我現在明白了。 – LonelyPilgrim 2013-02-28 17:18:21