Getting both Having and Not Having in same row
You can use a case expression like:

SELECT count(case when cnt = 1 then 1 end) as one_order
     , count(case when cnt &gt; 1 then 1 end) as more_than_one_order
FROM (
    select customer_id, count(1) as cnt from orders GROUP BY customer_id
) as T


You can also use a filter clause for the count aggregates:

SELECT count(1) filter (where cnt = 1) as one_order
     , count(1) filter (where cnt &gt; 1) as more_than_one_order
FROM ...


For the third attribute you can either reuse the aggregates:

select count(1) filter (where cnt = 1) as ...
     , count(1) filter (where cnt &gt; 1) as ...
     , count(1) filter (where cnt = 1) / count(1) filter (where cnt &gt; 1) as ...


or add another level of nesting: 

select one_order
     , more_than_one_order
     , one_order / more_than_one_order 
from (
    SELECT count(1) filter (where cnt = 1) as one_order
         , count(1) filter (where cnt &gt; 1) as more_than_one_order
    FROM (
        select customer_id, count(1) as cnt 
        from orders 
        GROUP BY customer_id
    ) as T1
) as T2