2017-01-21 4 views
0

У меня есть следующие столбцы таблицы (с данными выборки)TSQL Столбцы в строках

[Member_ID] - [GM1] - [GM2] ... [GM12] - [CATEGORY] 
165 - 30 - 50 ... 40 - Products 
165 - 70 - 60 ... 70 - Service 
189 - 50 - 60 ... 50 - Products 
189 - 40 - 30 ... 40 - Service 

Каждый столбец ГМ для каждого месяца.

В конце я хотел бы иметь что-то вроде этого

[MemberID] - [GMP] - [GMS] - [MonthNumbr] 
165 - 30 - 70 - 1 
165 - 50 - 60 - 2 
189 - 50 - 40 - 1 
... 
165 - 40 - 70 - 12 
189 - 50 - 40 - 12 

Где GMP является ГМ за этот месяц для категории продукта и GMS является ГМ за этот месяц для службы

Я попытался UNPIVOT и крест применяется, но я думаю, что это путь по моему опыту и продолжать застревать.

благодарит заранее!

ответ

0

Мне нравится использовать outer apply для этой цели. , , затем агрегация помогает:

select v.member_id, v.monthnumber, 
     max(case when category = 'products' then gm end) as gmp, 
     max(case when category = 'service' then gm end) as gms 
from t outer apply 
    (values (t.member_id, 1, t.gm1, t.category), 
      (t.member_id, 2, t.gm2, t.category), 
       . . . 
    ) v(member_id, monthnumber, gm, category) 
group by v.member_id, v.monthnumber; 

EDIT:

Это может быть более эффективным, чтобы сделать агрегацию подзапроса:

select v.* 
from t outer apply 
    (select v.member_id, v.monthnumber, 
      max(case when category = 'products' then gm end) as gmp, 
      max(case when category = 'service' then gm end) as gms 
     from (values (t.member_id, 1, t.gm1, t.category), 
        (t.member_id, 2, t.gm2, t.category), 
        . . . 
      ) v(member_id, monthnumber, gm, category) 
    ) v; 

(Из-за природы алгоритмов агрегации, куча небольшие агрегаты должны быть более эффективными, чем один большой.)

Смежные вопросы