聚合 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_PROFIT
和 2018_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
我使用 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_PROFIT
和 2018_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