在 SQL Table 上获取多个相关计数
Getting Multiple Related Counts On SQL Table
我正在尝试统计以城市为起点和终点的所有游乐设施。
我的表格与此类似:
游乐设施:rno (int), src (from location lcode), dst (to location lcode)
位置:lcode (str), prov (str), city (str)
我想要 return 城市和省的列表,以及以该城市为 "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
这非常有效,return正确的数据集:
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
结果对我来说没有意义,所以我假设我做的事情在逻辑上是错误的,但我不知道是什么。有人能告诉我为什么这会给我带来不希望的结果吗?
最简单的解决方案是使用 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
发生的事情,反之亦然。
我正在尝试统计以城市为起点和终点的所有游乐设施。
我的表格与此类似:
游乐设施:rno (int), src (from location lcode), dst (to location lcode)
位置:lcode (str), prov (str), city (str)
我想要 return 城市和省的列表,以及以该城市为 "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
这非常有效,return正确的数据集:
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
结果对我来说没有意义,所以我假设我做的事情在逻辑上是错误的,但我不知道是什么。有人能告诉我为什么这会给我带来不希望的结果吗?
最简单的解决方案是使用 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
发生的事情,反之亦然。