2014-10-30 28 views
0

在创建表时,可以使用ON NULL(或DEFAULT?)与select * from()pivot()来替换零值为零吗?使用ON NULL和从透视结果创建表(在oracle中)

说明: 事务表包含CUSTOMER_ID,item_qty,部门,transaction_key,销售

的任务是创造它提供了一个单独的行,包含的项目,交易量和销售量在每个数每个客户的表部。

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

很确定它需要在内联子查询(select *语句)之外是nvl(),但是这需要列出所有列,如select svn(socks_sales,0)socks_sales,nvl(socks_items,0)socks_items ...等等 - 但我会去尝试确认 – 2014-10-30 18:06:51

+0

也许有一种解决方案,使用pl sql来创建列名并在创建后运行“alter table ..”。 – 2014-10-30 18:09:54

回答

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错误。 要避免此问题,请为枢轴列 标题,聚合函数或两者指定较短的别名。 “

”假设有很多部门和一些领域要聚合,单独列出每一列并不方便。“

我想你应该列出所有的列如果你使用CTAS。 Oracle不提供方便的名称来转换列。

+0

列出所有的列可能是艰难的,打算使用create table作为select * from pivot(),如上例所示。 – 2014-10-30 19:10:23

+0

@justin cress但是在这种情况下,您不能应用NVL(它不能在PIVOT内工作) – Multisync 2014-10-30 19:16:54

+0

我同意。 NVL不能解决问题。因此,调查DEFAULT或ON NULL选项。 IDK,也许没有一个优雅的解决方案。 – 2014-10-30 20:42:29