0

我正在尝试创建一个类似于 excel 的数据透视表,其中包含 3 列信息、订单类型、产品代码以及该订单产生的收入。

我已经设法从订单 tpye 订购的同一产品的每个订单中获得产生的收入。

select ORDER_TYPE, PRODUCT_CODE, sum(INCOME)
from Logistics
group by ORDER_TYPE, PRODUCT_CODE
order by ORDER_TYPE;

输出查询的片段:

ORDER_TYPE, PRODUCT_CODE, sum(INCOME):
EB  ZOL 432919
EB  ITA 24832674
EB  ELM 2095035
EB  FRI 1464608
EB  ESZ 0
EB  GON 1707758
EB  PVE 23130
EK  FRI 10560880
EK  ITA 30207062
EK  PVE 1625576
EK  ESZ 0
EK  ZOL 1467432
EK  GON 11208618
EK  ELM 14159542
ER  PVE -12449
ER  ITA -3808222
ER  ELM -236587
ER  ZOL -17394
ER  GON -16758710
ER  FRI -102844
ER  ESZ -104169
ER      33142
ES  ZOL 13883
ES  FRI -12860
ES  ELM -107442
ES  SZO -46800
ES  PVE 0
ES  GON 0
ES  ITA -61427
E1  ELM 29195518

正如您所看到的,由于产品不同,现在每种订单类型都有几行。

如何修改此查询以获取一个数据透视表,其中包含每种订单类型的列和产品代码的行,因此我只有一列用于订单类型而不是行?

例如:

    EB    EK    ES    ER
ZOL income datas
ITA for every
ELM cell
FRI 
ESZ 
GON 
PVE 
FRI 
4

3 回答 3

1

用例当

select PRODUCT_CODE,(case when ORDER_TYPE='EB' then s_income end) as EB,
sum(case when ORDER_TYPE='Ek' then income else 0 end) as EK,
sum(case when ORDER_TYPE='ES' then income else 0  end) as ES,
sum(case when ORDER_TYPE='ER' then income else 0  end) as ER
from Logistics group by PRODUCT_CODE
于 2019-03-31T18:49:48.607 回答
1

您标记了 Oracle18c,因此这应该适用于您的版本。我在 11g 上测试了这个。

SELECT *
FROM (
  SELECT product_code, order_type, income
  FROM Logistics
)
PIVOT (
  sum(income)  
  for order_type
  IN ('EB' AS EB, 'ER' AS ER, 'ES' AS ES, 'EK' AS EK)
);

这确实需要在执行之前填写 IN 列表的集合。还有另一种语法允许子选择,但它返回 XML。如果您尝试用 PIVOT 替换 PIVOT XML,则会出现错误。

WITH orderTypes AS
(
    select 'EB' as order_type from dual union all
    select 'ER' as order_type from dual union all
    select 'ES' as order_type from dual union all
    select 'EK' as order_type from dual union all 
    select 'AA' as order_type from dual union all
    select 'AB' as order_type from dual union all
    select 'AC' as order_type from dual union all
    select 'AD' as order_type from dual union all
    select 'AE' as order_type from dual        

)
SELECT *
FROM (
  SELECT l.product_code, l.order_type, l.income
  FROM Logistics l
)
PIVOT XML  (
  sum(income) AS orderSum
  for order_type 
  IN ( select order_type from orderTypes)
);
于 2019-03-31T20:38:46.697 回答
1

使用 Oracle SQL https://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1中定义的数据透视表功能

于 2019-03-31T20:26:29.627 回答