У меня есть таблица "Ценности":
int id;
double amount;
Date date;
String cryptoName;
Мне нужно получить результат с "датой" и списком "cryptoName" и получить что-то вроде:
btc ltc drk 42coin
27-DEC-14 0.2 5.0 100.0 0.01
28-DEC-14 0.22 5.5 99.5 0.02
29-DEC-14 0.23 6.1 100.6 0.03
30-DEC-14 0.25 6.0 101.2 0.03
Я могу сделать это:
select "Values"."date", LISTAGG("amount", ', ') WITHIN GROUP (ORDER BY "cryptoName") as "result" from "Values" GROUP BY "Values"."date"
Но в этом случае я получаю два столбца: "дата" и "результат" с моим списком, но мне нужно получить столбец "дата", а несколько столбцов зависят от того, сколько уникального "cryptoName" в таблице. Как я могу это сделать?
Начиная с 11g R1, вы можете использовать оператор PIVOT. см., например: http://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php
Или вы можете использовать функцию DECODE вместе с SUM, если вы знаете все уникальные значения столбца ctyptoName следующим образом:
select date,
sum(decode(cryptoName,'value1',amount,0)) as Value1
,sum(decode(cryptoName,'value2',amount,0)) as Value2
,...
from Values
group by date