如何在Oracle中旋转表?

时间:2011-08-19 18:46:43

标签: sql oracle

我需要将左表旋转到右边:

enter image description here

左表非常长,约1000行。问题是自动为右表中的列命名。

感谢。

3 个答案:

答案 0 :(得分:2)

如果您使用的是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 :(得分:1)

你会做这样的事情

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

答案 2 :(得分:1)

您可以尝试这样做,但您需要对值进行硬编码。你可以编写一个脚本来为你生成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;

更新 您可以使用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;