SQL подсчет элементов из двух столбцов - PullRequest
0 голосов
/ 10 июля 2020

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

table: rider_geo_addresses
==================================
|id  | origin_id | destination_id |
==================================
 1        4             8
 1        2             6
 1        8             4
 1        6             2
 1        1             5
 1        2             8

Мне нужен запрос, который даст мне объединенное количество origin_id и destination_id отсортированных des c

table: result
============================
| geo_addresses  | counter |
============================
       8              3
       2              3
       6              2
       4              2
       5              1
       1              1

Я попытался получить значения в двух отдельных таблицах и используйте union , чтобы объединить их, но он не принимает во внимание те же значения, которые могут отображаться в обоих столбцах. Вот что я пробовал

select ( origin_id) as geo_addresses, count(origin_id) as counter
from rider_geo_addresses
where rider_profile_id
group by  origin_id
union
select ( destination_id) as geo_addresses, count(destination_id) as counter
from rider_geo_addresses
where rider_profile_id
group by  destination_id
order by counter desc;

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Насколько я понимаю, ваше решение будет заключаться в группировке после объединения

SELECT 
  geo_addresses
  ,count(*) as counter 
FROM (
   select origin_id as geo_addresses
   from rider_geo_addresses
   where rider_profile_id
   union all
   select destination_id as geo_addresses
   from rider_geo_addresses
   where rider_profile_id
) t
GROUP BY geo_addresses
ORDER BY counter desc 
0 голосов
/ 10 июля 2020

Вы можете использовать full join вместо union all:

select geo_addresses, ( coalesce(o.cnt, 0) + coalesce(d.cnt, 0) ) as counter
from (select origin_id as geo_addresses, count(*) as cnt
      from rider_geo_addresses
      where rider_profile_id
      group by origin_id
     ) o full join
     (select destination_id) as geo_addresses, count(*) as cnt
      from rider_geo_addresses
      where rider_profile_id
      group by  destination_id
     ) d
     using geo_addresses
order by counter desc;
0 голосов
/ 10 июля 2020

Использование Union All вместо Union должно дать правильный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...