#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
Ответ №3:
select * from table1
pivot(count(product)
for product
in ('a' "product(a)", 'b' "product(b)", 'c' "product(c)", 'd' "product(d)"));