Один оператор SELECT, использующий оператор GROUP BY GROUPING SETS
для любого количества столбцов.В приведенном ниже примере предполагается, что константы являются результатом соответствующей длины (varchar_col).
with tab as (
select
length(a) a
, length(b) b
, count(1) cnt
, grouping(length(a)) a_grp
, grouping(length(b)) b_grp
from table(values
('X01', 'New York')
, ('X02', 'London')
, ('X03', 'Los Angeles')
, ('X04', 'Paris')
, ('X05', 'San Francisco')
) t (a, b)
group by grouping sets ((length(a)), (length(b)), ())
)
, row_count as (select cnt from tab where a_grp + b_grp = 2)
, top as (
select a, b, cnt, rownumber() over(partition by a_grp, b_grp order by cnt desc) rn_
from tab
where a_grp + b_grp = 1 -- number of columns - 1
)
select a, b, cnt, 100*cnt/nullif((select cnt from row_count), 0) pst
from top
where rn_=1;
A B CNT PST
-- -- --- ---
3 - 5 100
- 5 1 20