在SQL表上获取多个相关计数

时间:2018-10-11 22:38:55

标签: sql sqlite relational-database

我正在尝试计算所有从城市位置到城市位置的游乐设施。

我的表与此类似:

乘坐:rno(int),src(从位置lcode),dst(到位置lcode)

位置:lcode(str),prov(str),城市(str)

我想返回城市和省份的列表,以及以该城市为“ src”位置的乘车计数,以及以该城市为“ dst”位置的乘车计数。

我试图这样建模:

SELECT
    l.city,
    l.prov,
    COUNT(rsrc.rno)
FROM
    locations l
    LEFT OUTER JOIN rides rsrc ON l.lcode = rsrc.src
GROUP BY
    l.city

这很完美,可以返回正确的数据集:

Calgary|Alberta|3
Edmonton|Alberta|37
Jasper|Alberta|0
Regina|Saskatchewan|1
Saskatoon|Saskatchewan|1
Vancouver|British Columbia|1

但是,当我再次尝试加入游乐设施以获取dst时,结果都是错误的:

SELECT
    l.city,
    l.prov,
    COUNT(rsrc.rno),
    COUNT(rdst.rno)
FROM
    locations l
    LEFT OUTER JOIN rides rsrc ON l.lcode = rsrc.src
    LEFT OUTER JOIN rides rdst ON l.lcode = rdst.dst
GROUP BY
    l.city

该查询的结果是:

Calgary|Alberta|19|21
Edmonton|Alberta|86|96
Jasper|Alberta|0|0
Regina|Saskatchewan|1|1
Saskatoon|Saskatchewan|2|2
Vancouver|British Columbia|1|3

结果对我来说没有意义,因此我认为我在做逻辑上错误的事情,但我不知道该怎么做。有人可以告诉我为什么这会给我带来不希望的结果吗?

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用count(distinct)

SELECT l.city, l.prov,
       COUNT(DISTINCT rsrc.rno), COUNT(DISTINCT rdst.rno)
FROM locations l LEFT JOIN
     rides rsrc
     ON l.lcode = rsrc.src LEFT JOIN
     rides rdst
     ON l.lcode = rdst.dst
GROUP BY l.city, l.prov;

问题是您的联接导致笛卡尔积。 COUNT()只是在计算匹配值的数量-但与rscr的匹配将乘以rdst发生的事情,反之亦然。