[英]Oracle - Converting a column to rows and getting a sum
我正在尝试将列转换为行并获得订单项的总和。 下面是数据库中当前数据的方式。 注意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
仅供参考,我当然是初学者和学生,所以请原谅我我的发布不正确。 任何帮助表示赞赏。
尝试这个:
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
子句由两部分组成-聚合和用于该聚合的值列表。 对于您的情况,使用的汇总是MAX
,因为看起来一个商店只能为一个特定产品创建一条记录。 如果不是这样,那么SUM
将是正确的功能。 同样,由于我们需要按商店而不是按产品的详细信息,因此我们在列表中指定store
列的不同值。
COALESCE
用于在默认空值ordered
列到0。最后,我们添加得到的总价值(合并为0后)的4个派生列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.