Oracle - 将列转换为行并获取总和

时间:2014-08-07 03:30:55

标签: sql oracle

我正在尝试将列转换为行并获取所订购项目的总和。以下是数据当前在数据库中的方式。请注意DollarDays商店如何显示并非所有商店都订购了所有商品。

Store         ItemNumber    Description    Ordered
----          ----------    ----------     ---------
WallyMart     10021         Corn           10         
J-Mart        10021         Corn           4
Big-H Foods   10021         Corn           32
WallyMart     20055         Beans          11         
J-Mart        20055         Beans          3
Big-H Foods   20055         Beans          21
DollarDays    50277         Onions         48

这是我的目标。它看起来几乎是按ItemNumber分组

ItemNumber    Description    WallyMart    J-Mart    Big-H Foods  DollarDays  TotalOrdered
----------    -----------    ---------    ------    -----------  ----------  ------------
10021         Corn           10           4         32           0            46
20055         Beans          11           3         21           0            35
50277         Onions         0            0         0            48           48

当我尝试PIVOT时,这是我得到的缩短的例子。我完全失去了。

ItemNumber    Description    WallyMart    J-Mart    Big-H Foods  DollarDays  
----------    -----------    ---------    ------    -----------  ----------
10021         Corn           10           Null      Null         Null
10021         Corn           Null         4         Null         Null
10021         Corn           Null         Null      32           Null
10021         Corn           Null         Null      Null         0

仅供参考我当然是初学者和学生,所以请原谅我,我没有完全正确地发布。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

试试这个:

select 
itemnumber, description, 
coalesce("WallyMart",0) as "WallyMart",
coalesce("J-Mart",0) as "J-Mart",
coalesce("Big-H Foods",0) as "Big-H Foods",
coalesce("DollarDays",0) as "DollarDays",
coalesce("WallyMart",0) + coalesce("J-Mart",0) + coalesce("Big-H Foods",0) +     coalesce("DollarDays",0) as "Total"
from
(select * from stores) s
pivot
(max(ordered)
 for store in 
 ('WallyMart' as "WallyMart",
  'J-Mart' as "J-Mart",
  'Big-H Foods' as "Big-H Foods",
  'DollarDays' as "DollarDays")) p

为了解释一下,PIVOT子句由2部分组成 - 聚合和用于此聚合的值列表。对于您的情况,使用的聚合是MAX,因为看起来一个商店只能有一个特定产品的记录。如果不是这样,SUM将是正确的功能。同样,由于我们需要存储明细而不是产品,我们在列表中指定store列的不同值。

COALESCE用于将ordered列中的空值默认为0.最后,我们添加4个派生列(在合并为0之后)以获取总值。

SQLFiddle