sql从两列计算元素

qzlgjiam  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(364)

我正在尝试提出一个查询,它允许我计算同一个表中两列的值。例如

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

我想要一个查询,它将给我的起源\标识和目的地\标识组合排序描述计数

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;
ycl3bljg

ycl3bljg1#

据我所知,你的解决办法是在工会结束后分组

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
igsr9ssn

igsr9ssn2#

使用union all而不是union应该可以得到正确的输出。

hwamh0ep

hwamh0ep3#

你可以用 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;

相关问题