Joomla 3.1 Templates by FatCow Coupon

Hесложный способ перевернуть запрос с группировкой

Категория: Блог Опубликовано 24.05.2017

Hесложный способ перевернуть запрос с группировкой
-- условимся, что перечень значений свойств был ограничен
-- для примера создадим таблицу со следующими полями 
-- 1) Название
-- 2) Цвет
-- по условиям задачи у нас сеть конечное количество цветов красный , зеленый , синий

create table t1(tid number,tname varchar2(20),tprop varchar2(20));


-- заполним таблицу данными

insert into t1 values(1,'круг','красный');
insert into t1 values(2,'круг','зеленый');
insert into t1 values(3,'круг','зеленый');
insert into t1 values(4,'круг','синий');
insert into t1 values(5,'квадрат','красный');
insert into t1 values(6,'квадрат','синий');
insert into t1 values(7,'квадрат','красный');
insert into t1 values(8,'треугольник','красный');
insert into t1 values(9,'треугольник','синий');



-- выполним свой

select tname, tprop, count(tprop) count from t1 group by tname, tprop




TNAME TPROP COUNT
круг синий 1
круг зеленый 2
круг красный 1
квадрат синий 1
квадрат красный 2
треугольник синий 1
треугольник красный 1


-- таким образом получим количество фигур определенного цвета 
-- преобразуем запрос к более интересному виду

select tname, sum(decode(tprop,'синий',1,0)) "синий", sum(decode(tprop,'красный',1,0)) "красный" , sum(decode(tprop,'зеленый',1,0)) "зеленый"  from t1 
group by tname


TNAME синий красный зеленый
квадрат 1 2 0
круг 1 1 2
треугольник 1 1 0


в oracle 11 g появилась конструкция pivot
которая позволяет переворачивать группировки с ограниченным количеством перечислений
приведу пример использования инструкции pivot в рамках решения заданной задачи

SELECT * FROM (select tname, tprop from t1)
  PIVOT ( count(tprop) FOR tprop IN  ('красный','синий','зеленый'));



TNAME 'красный' 'синий' 'зеленый'
квадрат 2 1 0
круг 1 1 2
треугольник 1 1 0

Просмотров: 300