2013-02-28 45 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