【问题标题】:SQL SELECT with GROUP BY, referring back to the groupSQL SELECT with GROUP BY,指回组
【发布时间】:2013-02-28 17:01:35
【问题描述】:

我是一个相对的 SQL 初学者,我不完全确定如何问我在问什么(所以我也不完全确定如何搜索有关它的帮助)。

我想使用SELECT 语句,该语句使用GROUP BY 子句按某个属性分组,同时引用该组选择的行。有没有办法做到这一点? (我使用的是 FWIW、SQLite3,但我认为这更多是通用 SQL 语法的问题。)

我有一张表population,其中包含有关人员和家庭的数据。每排是一个人,每个人都被分成从一到十几个的家庭。

每个家庭一个人(通常是第一个人,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_idDISTINCT

有什么建议吗?提前致谢。

【问题讨论】:

    标签: sql sqlite group-by


    【解决方案1】:

    试试看,

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

    【讨论】:

    • 谢谢!这行得通,但我仍然对为什么有些摸不着头脑。让我直截了当地说:对于组的每个成员,您的子句将“head_id”设置为 1(如果“head”== 1)或 NULL。然后它找到该组的 MAX,由于该组中的每个人都为 NULL,除了头部,它只选择为 1 的那个(NULL 沉到底部)。
    • 你是对的。我不必解释COUNT(),因为我知道你已经知道了。你对这一行感到困惑:MAX(CASE WHEN head = 1 THEN uid ELSE NULL END) 对吧?请记住,您正在通过household_id 聚合记录,因此它会在搜索head = 1 的所有记录上运行。如果找到,则该列的值为uid,否则为null。要完全理解,请执行此查询,SELECT household_id, CASE WHEN head = 1 THEN uid ELSE NULL END AS HeadID FROM population
    • 谢谢;是的,这是我不确定的。我现在明白了。
    【解决方案2】:

    你本可以走在正确的轨道上

    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;
    

    但您需要为 population 表设置别名,因为它在查询中使用了两次。

    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;
    

    【讨论】:

    • 谢谢!这也有效,并且准确地表达了我想说的话。我仍在弄清楚混叠;这很有帮助。
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2017-05-29
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多