我正在尝试将列转换为行并获取所订购项目的总和。以下是数据当前在数据库中的方式。请注意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
仅供参考我当然是初学者和学生,所以请原谅我,我没有完全正确地发布。 任何帮助表示赞赏。
答案 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之后)以获取总值。