这个问题在这里已经有了答案:
8年前关闭。
Possible Duplicate:
Oracle Rows to Column Transformation
我真正的问题就是这样,但有很多相互关联的表。所以,我刚刚创建了一个例子,所以假设如果这个问题得到解决,我真正的问题就解决了。
这是我的表:
tbl_products
tp_id | tp_name
1 apple
2 mango
3 pineapple
tbl_sales
ts_id | ts_location | ts_tp_id | ts_sales
1 NY 2 5
2 LN 2 10
3 QL 1 25
4 QL 3 20
5 LN 3 35
6 NY 3 50
7 NY 1 100
如果我有这两个表,tbl_products 和 tbl_sales,如何创建一个具有如下动态列的查询:
sales_location | apple | mango | pineapple
NY 100 5 50
苹果,芒果和菠萝应该有根据位置的销售总数
最佳答案
由于您使用的是Oracle10g,所以没有PIVOT
函数,因此您必须使用带有 CASE
的聚合函数来执行此类转换。陈述。
如果提前知道这些值,那么您可以将它们硬编码为静态版本:
select s.ts_location,
sum(case when p.tp_name = 'apple' then s.ts_sales else 0 end) Apple,
sum(case when p.tp_name = 'mango' then s.ts_sales else 0 end) Mango,
sum(case when p.tp_name = 'pineapple' then s.ts_sales else 0 end) Pineapple
from tbl_sales s
inner join tbl_products p
on s.ts_tp_id = p.tp_id
group by s.ts_location
见 SQL Fiddle with Demo
但是,如果您的值事先不知道,那么您必须实现动态 sql,并且在 Oracle 中您将需要为此使用一个过程:
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select s.ts_location ';
begin
for x in (select distinct tp_name from tbl_products order by 1)
loop
sql_query := sql_query ||
' , sum(case when p.tp_name = '''||x.tp_name||''' then s.ts_sales end) as '||x.tp_name;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from tbl_sales s
inner join tbl_products p
on s.ts_tp_id = p.tp_id
group by s.ts_location';
dbms_output.put_line(sql_query);
open p_cursor for sql_query;
end;
/
然后返回您可以使用的结果(注意:这是我在 Toad 中的做法):
variable x refcursor
exec dynamic_pivot(:x)
print x
两者都会返回结果:
| TS_LOCATION | APPLE | MANGO | PINEAPPLE |
-------------------------------------------
| LN | 0 | 10 | 35 |
| QL | 25 | 0 | 20 |
| NY | 100 | 5 | 50 |
关于sql - 甲骨文 : Dynamic column name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14156928/