我需要将左表旋转到右边:
左表非常长,约1000行。问题是自动为右表中的列命名。
感谢。
答案 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;