Используйте UNION ALL
внутри CTE
, чтобы вернуть все числовые значения в виде 1 столбца, и еще один CTE
, чтобы вернуть первые 3 для каждого магазина с ROW_NUMBER()
.Наконец, сгруппируйте по магазинам:
with
cte as (
select store, p as col, 'P' name from tablename union all
select store, q, 'Q' from tablename union all
select store, l, 'L' from tablename union all
select store, j, 'J' from tablename union all
select store, k, 'K' from tablename union all
select store, d, 'D' from tablename
),
ctern as (
select *, row_number() over (partition by store order by col desc) rn
from cte
)
select store, string_agg(name, ',') within group (order by rn) [TOP ISSUES]
from ctern
where rn <= 3
group by store
См. Демоверсию .Результаты:
STORE | TOP ISSUES
DC12 | L,Q,P
DC45 | K,D,L
DC78 | Q,P,J
HF45 | D,K,J