Получение нескольких связанных показателей в таблице SQL - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь получить счетчик всех поездок, в которых есть город как из местоположения, так и из местоположения.

Мои таблицы похожи на это:

поездки: rno (int), src (из местоположения lcode), dst (из местоположения lcode)

местоположения: lcode (str), prov (str), city (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 голосов
/ 12 октября 2018

Самое простое решение - использовать 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 и наоборот.

...