Здравствуйте!
Знаю, что эту задачу можно решить с помощью оператора 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
Спасибо.
Здравствуйте, 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
Здравствуйте, 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, конечно, изящнее.