可以将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更新为零,但是是否可以为列设置默认值?假设有很多部门和许多字段要聚合,单独列出每一列是不方便的。 (而且,枢轴操作员是不是应该让这些操作更优雅?)
答案 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没有为透视列提供方便的名称。