1

我无法让 COUNT(*)=0 显示在列中。这个问题已经在某种程度上得到了解决:如何使这个查询也返回计数值为 0 的行?

...但我无法将解决方案推广到多个不同的类别。这是我的情况:我有 11 个不同类别的停车位置和 4 个不同的附属类别:


    # 从受访者中选择不同的停车位置;
     停车位
    ------------------
     街头免费
     城市车库
     UC地段
     rpp 访问者
     街外免费
     其他
     无处
     其他付费
     仪表
     禁用
     rpp
    (11 行)

    # 从受访者中选择不同的隶属关系;
     联系
    -------------
     学院
     本科
     毕业
     职员
    (4 行)

我的本科生受访者都没有使用残疾人停车位,所以当我尝试按parking_location计算它们时,我只得到10行:

    SELECT park_location,COUNT(*) FROM 受访者 WHERE affiliation='undergrad' GROUP BY park_location;
     停车位 | 数数
    ------------------+--------
     街头免费| 2
     仪表 | 25
     城市车库 | 5
     rpp | 21
     无处| 1012
     UC 很多 | 33
     rpp 访问者 | 10
     街外免费| 10
     其他| 10
     其他付费 | 12
    (10 行)

没问题。上述链接显示了如何使 0 出现:

    ths=# WITH c as (SELECT DISTINCT park_location FROM 受访者),
    ths-# r AS (SELECT affiliation, park_location, COUNT(*) AS count FROM 受访者 WHERE affiliation='undergrad' GROUP BY 1,2)
    ths-# SELECT c.parking_location, COALESCE(r.count, 0) AS count FROM c
    ths-# LEFT JOIN r ON c.parking_location = r.parking_location
    ths-# ORDER BY park_location;
     停车位 | 数数
    ------------------+--------
     无处| 1012
     仪表 | 25
     rpp | 21
     rpp 访问者 | 10
     街头免费| 2
     UC 很多 | 33
     街外免费| 10
     城市车库 | 5
     其他付费 | 12
     残疾人| 0
     其他| 10
    (11 行)

但现在我想展示所有从属关系的表格,而不仅仅是本科生。此外,我想先按从属关系订购结果表,然后按parking_location。我以为我可以删除上面的 WHERE 子句,但后来我的本科禁用列消失了:

    ths=# WITH c as (SELECT DISTINCT park_location FROM 受访者),
    ths-# r AS (SELECT affiliation,parking_location, COUNT(*) AS count FROM respondent GROUP BY affiliation,parking_location)
    ths-# SELECT r.affiliation, c.parking_location, COALESCE(r.count, 0) FROM c
    ths-# LEFT JOIN r ON c.parking_location = r.parking_location
    ths-# ORDER BY affiliation,parking_location;
     隶属关系 | 停车位 | 合并
    -------------+------+----------
    
     员工 | 城市车库 | 34
     员工 | 其他付费 | 50
     员工 | 残疾人| 18
     员工 | 其他| 61
     本科 | 无处| 1012
     本科 | 仪表 | 25
     本科 | rpp | 21
     本科 | rpp 访问者 | 10
     本科 | 街头免费| 2
     本科 | UC 很多 | 33
     本科 | 街外免费| 10
     本科 | 城市车库 | 5
     本科 | 其他付费 | 12
     本科 | 其他| 10
     毕业 | 无处| 1113
     毕业 | 仪表 | 96
     毕业 | rpp | 31
    

有什么帮助吗?

4

1 回答 1

1

尝试类似:

WITH all_parking_locations as (SELECT DISTINCT parking_location 
                               FROM respondents),

     all_affiliations as  (SELECT DISTINCT affiliation 
                           FROM respondents),

     all_counts as (SELECT affiliation, parking_location, COUNT(*) AS count 
                    FROM respondents 
                    GROUP BY affiliation, parking_location)

SELECT aa.affiliation, apl.parking_location, COALESCE(ac.count,0) as count
FROM all_affiliations aa
CROSS JOIN all_parking_locations apl
LEFT JOIN all_counts ac ON ac.affiliation = aa.affiliation
                       AND ac.parking_location = apl.parking_location
ORDER BY aa.affiliation, apl.parking_location
于 2013-02-15T20:24:32.373 回答