聚合 PIVOT 函数产生的列

Aggregating the columns resulted by PIVOT function

我使用 PIVOT 函数使用以下查询:

SELECT *
    FROM (SELECT medicine_name, YEAR_OF_PURCHASE, profit_in_rupees FROM temp_1
         )
         PIVOT
            (AVG (NVL (profit_in_rupees, 0)) AS avg_profit
            FOR (year_of_purchase)
            IN ('2017' AS "2017", '2018' AS "2018"))
ORDER BY medicine_name;

这成功地为我提供了两个必需的列,2017_AVG_PROFIT2018_AVG_PROFIT,现在我必须在同一个查询中再添加两个列。

1) 我想添加一个列,它可以显示这两列之间的区别,意思是 2018_AVG_PROFIT 减去 2017_AVG_PROFIT。 2) 我还想知道使用上述列值,与 2017 年相比,我们在 2018 年获得的利润百分比较低。

提前致谢。

SELECT   medicine_name, 
         "2017_AVG_PROFIT", 
         "2018_AVG_PROFIT", 
         Nvl("2017_AVG_PROFIT", 0) - Nvl("2018_AVG_PROFIT", 0) AS "DIFF_AVG_PROFIT", 
         CASE "2017_AVG_PROFIT" 
                  WHEN 0 THEN NULL 
                  ELSE Cast(Nvl("2018_AVG_PROFIT", 0) AS DECIMAL(12,2)) / 
                    Cast("2017_AVG_PROFIT" AS DECIMAL(12,2))
         END AS "PERC_DIFF" 
FROM     ( 
                SELECT medicine_name, 
                       year_of_purchase, 
                       profit_in_rupees 
                FROM   temp_1 ) PIVOT (avg (nvl (profit_in_rupees, 0)) 
                                       AS avg_profit FOR (year_of_purchase) IN ('2017' AS "2017",
                                                                                                                '2018' AS "2018"))
ORDER BY medicine_name;

对于这个示例 schema/data:

CREATE TABLE temp_1
(
  medicine_name varchar2(25), 
  year_of_purchase number(4),
  profit_in_rupees number(10)
);

INSERT INTO temp_1 (medicine_name, year_of_purchase, profit_in_rupees) VALUES ('m1', 2017, 100);
INSERT INTO temp_1 (medicine_name, year_of_purchase, profit_in_rupees) VALUES ('m2', 2017, 200);
INSERT INTO temp_1 (medicine_name, year_of_purchase, profit_in_rupees) VALUES ('m3', 2017, 300);
INSERT INTO temp_1 (medicine_name, year_of_purchase, profit_in_rupees) VALUES ('m1', 2018, 400);
INSERT INTO temp_1 (medicine_name, year_of_purchase, profit_in_rupees) VALUES ('m2', 2018, 100);
INSERT INTO temp_1 (medicine_name, year_of_purchase, profit_in_rupees) VALUES ('m3', 2018, 100);

它returns:

MEDICINE_NAME   2017_AVG_PROFIT  2018_AVG_PROFIT     DIFF_AVG_PROFIT     PERC_DIFF
m1              100              400                 -300                4
m2              200              100                 100                 0.5
m3              300              100                 200                 0.333