помогите разобраться с pivot
От: corpse56  
Дата: 13.01.20 16:30
Оценка:
Здравствуйте!
Знаю, что эту задачу можно решить с помощью оператора pivot, но никак не соображу как.

Есть такая таблица:


  select 'st1' st,'abc' pr
  union all
  select 'st2' st,'def' pr
  union all
  select 'st1' st,'def' pr
  union all
  select 'st2' st,'abc' pr
  union all
  select 'st1' st,'abc' pr
  union all
  select 'st2' st,'xyz' pr


Хочется получить вот такой результат:

----------------------------
pr | st1 | st2
----------------------------
abc | 2 | 1
def | 1 | 1
xyz | 0 | 1
----------------------------

И если это вообще возможно, то ещё и вот такой:

----------------------------
pr | st1 | st2 | total
----------------------------
abc | 2 | 1 | 3
def | 1 | 1 | 2
xyz | 0 | 1 | 1


Пример реальный, просто сведённый к абстрации. st может иметь только 2 значения. pr может иметь много разных значений.
Используется MS SQL 2008R2
Спасибо.
Re: помогите разобраться с pivot
От: Olaf Россия  
Дата: 13.01.20 17:34
Оценка: 3 (1)
Здравствуйте, corpse56, Вы писали:

C>Знаю, что эту задачу можно решить с помощью оператора pivot, но никак не соображу как.


C>Есть такая таблица:

C>...

C>Хочется получить вот такой результат:

C>...

C>И если это вообще возможно, то ещё и вот такой:

C>...

Вот так ?
with cte as
(
    select 'st1' st,'abc' pr
    union all
    select 'st2' st,'def' pr
    union all
    select 'st1' st,'def' pr
    union all
    select 'st2' st,'abc' pr
    union all
    select 'st1' st,'abc' pr
    union all
    select 'st2' st,'xyz' pr
)
select pr, [st1], [st2], [st1] + [st2] as total
from cte c
pivot
(
    count(st) for st in([st1], [st2]) 
) as pvt
Re[2]: помогите разобраться с pivot
От: corpse56  
Дата: 14.01.20 09:38
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Вот так ?


ДА!
Я не учитывал только одного, что pivot оператору (или таблице? не знаю как правильно назвать) нужно обязательно дать алиас! И всё время получал ошибку неправильного синтаксиса. А так может быть получилось бы у самого...
Спасибо!
Есть ещё один вариант решения этой задачки без pivot, кому интересно:

 with cte as
(
    select 'st1' st,'abc' pr
    union all
    select 'st2' st,'def' pr
    union all
    select 'st1' st,'def' pr
    union all
    select 'st2' st,'abc' pr
    union all
    select 'st1' st,'abc' pr
    union all
    select 'st2' st,'xyz' pr
),
cte1 as(
select pr,
case when st = 'st1' then 1 else 0 end st1,
case when st = 'st2' then 1 else 0 end st2
from cte
)
select pr,sum(st1),sum(st2),sum(st1)+sum(st2)
from cte1
group by pr


Это может пригодится, если переезжать на другую СУБД, в которой нет pivot. но pivot, конечно, изящнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.