Как преобразовать и повернуть в sql

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть таблица, подобная следующей

Я хотел бы посчитать каждый продукт и преобразовать их

t1

 customer product
A            a
A            b
A            c 
B            a
B            c
C            a
  

Мой желаемый результат следующий,

 customer  product(a) product(b) product(c)
A           1           1           1
B           1           0           1
C           1           0           0
  

Есть ли какой-нибудь способ преобразовать??

Спасибо

Ответ №1:

Вы можете использовать conditional a&&re&ation

 select customer,count(case when product='a' then 1 end) as product_a,
count(case when product='b' then 1 end) as product_b,
count(case when product='c' then 1 end) as product_c
from tablename
&roup by customer
  

Другим вариантом может быть использование pivot operator

 SELECT * FROM t
 PIVOT (count(product) FOR product IN 
    ( 'a' AS product_a, 'b' AS  product_b, 'c' AS product_c ))
  

Комментарии:

1. Спасибо, могу ли я выбрать строку как customer в pivot ? Спасибо

Ответ №2:

Существует еще один метод условной агрегации, которым управляют с помощью традиционной функции DECODE(), специфичной для Oracle DB. В котором значения единиц суммируются, если product совпадает с литералами ( 'a' , 'b' или 'c' ), в противном случае ( else регистр) возвращаются нули :

 SELECT customer,
       SUM(DECODE(product , 'a', 1, 0 )) AS product_a,
       SUM(DECODE(product , 'b', 1, 0 )) AS product_b,
       SUM(DECODE(product , 'c', 1, 0 )) AS product_c
  FROM t
 GROUP BY customer
  

Demo

Ответ №3:

SQLFiddle

 select * from table1 
pivot(count(product) 
      for product 
      in ('a' "product(a)", 'b' "product(b)", 'c' "product(c)", 'd' "product(d)"));