使用ON NULL与pivot结果中的create table(在oracle中)

时间:2014-10-30 17:58:45

标签: sql oracle null pivot

可以将ON NULL(或DEFAULT?)与select * from()pivot()结合使用,在创建表时将空值替换为零吗?

说明: 事务表包含customer_id,item_qty,department,transaction_key,sales

任务是创建一个表,为每个客户提供一行,其中包含每个部门中的项目数,交易数和销售额。

create table merchandise_summary as
select * 
from (select customer_id, item_cd, department, transaction_key, sales from transaction_table)
pivot (
    sum(item_qty) items,
    count(distinct transaction_key) transactions,
    sum(sales) sales
 for department in ('socks', 'dresses', 'shoes')
)

此表将为任何不从袜子部门购买任何东西的客户创建空值,但实际上该值应为零(客户购买零袜子)。

单独的查询可以在创建表后将值从null更新为零,但是是否可以为列设置默认值?假设有很多部门和许多字段要聚合,单独列出每一列是不方便的。 (而且,枢轴操作员是不是应该让这些操作更优雅?)

1 个答案:

答案 0 :(得分:2)

是的,这是可能的,但您最好使用短别名:

create table merchandise_summary as
select customer_id, item_cd, department, sock_s, sock_tr, dress_s, dress_tr, shoe_s, nvl(shoe_tr, 0) shoe_tr
from (select customer_id, item_cd, department, transaction_key, sales from transaction_table)
pivot (
    sum(item_qty) s,
    count(distinct transaction_key) tr,
    sum(sales) sales
 for department in ('socks' as sock, 'dresses' as dress, 'shoes' as shoe)
)
  

数据库为每个新列生成一个名称。如果你不   为聚合函数提供别名,然后数据库使用   每个数据透视表列值作为每个新列的名称   汇总值被转置。如果您为。提供别名   聚合函数,然后数据库为每个新生成一个名称   通过连接将聚合值转换到的列   数据透视表名称,下划线字符(_)和   聚合函数别名。如果生成的列名称超过   列名的最大长度,然后返回ORA-00918错误。   要避免此问题,请为pivot列指定较短的别名   标题,聚合函数或两者。

"假设有许多部门和若干字段要聚合,单独列出每一列是不方便的。"

如果你正在使用CTAS,我想你无论如何都需要列出所有列。 Oracle没有为透视列提供方便的名称。