Как повернуть таблицу в Oracle? - PullRequest
3 голосов
/ 19 августа 2011

Мне нужно повернуть левый стол вправо:

enter image description here

И левый стол очень длинный, около 1000 строк.Проблема в том, чтобы автоматически присваивать имена столбцам в правой таблице.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Если вы в Oracle 11g, есть функция сводных запросов.Я еще не использовал его, но похоже, что вот что вам нужно:

select * from (
   select bill, goods
   from bills
)
pivot 
(
   count(goods)
   for goods in ('TV', 'CD', 'phone', 'mouse')
)
order by bill

Кажется, вам необходимо перечислить возможные значения для goods.Но если вам нужно сгенерировать это на лету, вы можете сделать один запрос, чтобы получить отдельные значения, превратить этот список в строку с разделителями-запятыми, а затем выполнить реальный запрос как динамический SQL или сгенерированный скрипт.

(я ожидаю, что будет таблица со списком возможных значений goods, которую можно использовать для создания списка значений вместо запроса большой таблицы фактов.)

1 голос
/ 19 августа 2011

Вы можете попробовать это, но вам нужно будет жестко закодировать значения.Вы можете написать скрипт для создания sql для вас.

SELECT
SUM(bill) AS bill
SUM(CASE goods WHEN ‘TV’ THEN bill ELSE 0 END) AS TV,
SUM(CASE goods WHEN ‘CD’ THEN 1 ELSE 0 END) AS CD,
-- 998 more like this
FROM
tab
GROUP BY goods;

UPDATE Вы можете использовать скрипт plsql для создания sql для вас, или вы можете изменить его для построения представлениядля тебя.Вы можете запустить скрипт для обновления представления при изменении значений.

DECLARE
  query_str VARCHAR;
BEGIN

select column_name from user_tab_columns where table_name = 'TAB';

query_str := 'SELECT SUM(bill) AS bill,';

for col in (select column_name from user_tab_columns where table_name = 'TAB') loop
  query_str := query_str || SUM(CASE goods WHEN ‘'' || col.column_name || ''’ THEN bill ELSE 0 END) AS ' ||  col.column_name || ', '
end loop;

query_str := query_str || ' FROM tab GROUP BY goods;';

dbms_output.put_line(query_str);

END;
1 голос
/ 19 августа 2011

Вы бы сделали что-то вроде этого

select bill, sum(p.TV), sum(p.CD)
  from (select bill, decode(goods,'TV',1,0) as TV, decode(goods,'CD',1,0) as CD
          from original_table) p
  group by bill

подробнее здесь: http://orafaq.com/node/1871

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...