sql - 甲骨文 : Dynamic column name

标签 sql oracle oracle10g pivot

这个问题在这里已经有了答案:




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/

相关文章:

sql - PL/SQL 数字或值错误 : number precision too large

C# 类和 Oracle 映射参数

sql - 使用 with 子句消除具有空值的重复行

oracle - 全局分区索引是否比非分区索引更好(更快)?

python - cx_Oracle 和输出变量

sql - 如何将该txt文件导入到SqlLiteStudio中的数据库表中

php - MySQL 查询中的 IF 和 AND

mysql - 查找具有最大值的元素。没有出现在 SQL 中

sql - Oracle 中带引号字段的 CREATE 语句

Oracle10g XE : Why PLS_INTEGER cannot be a column type