【发布时间】:2019-11-04 06:44:38
【问题描述】:
我正在制作一份报告以显示 2018 年每个月的总利润,并在某些月份没有赚取利润时显示 NIL
赚取的利润 = 0.1 * Total_payment。 服务完成后赚取利润,“Total_payment”列来自表BOOKING,我必须加入BOOKING和SERVICE才能获得每个月的总利润,Booking_num是加入BOOKING和SERVICE的关键, Actual_end 是服务的结束日期
现在的问题是 1 月、2 月和 8 月没有赚取利润。 无论如何,这三个月的利润栏中是否显示 NIL?
SELECT EXTRACT(MONTH FROM Actual_end) AS MONTH,SUM(Total_payment *0.1) AS PROFIT
FROM SERVICE,BOOKING
WHERE SERVICE.Booking_num = BOOKING.Booking_num
AND EXTRACT(YEAR FROM Actual_end) = 2018
GROUP BY EXTRACT(MONTH FROM Actual_end);
这是显示9个月利润的代码,没有一月,二月和八月
MONTH PROFIT
3 88.4
4 146.1
5 112.6
6 108.3
7 102.6
9 130.3
10 72.6
12 124.9
我希望输出是
MONTH PROFIT
1 NIL
2 NIL
3 88.4
4 146.1
5 112.6
6 108.3
7 102.6
8 NIL
9 130.3
10 72.6
11 124.9
12 25.2
怎么修改,我也试过了
WITH CALENDAR AS(
SELECT TO_CHAR(add_months(date '2018-01-01',ROWNUM -1),'MM') AS MONTH
FROM DUAL
CONNECT BY LEVEL <=12)
SELECT CALENDER.MONTH, NVL(SUM(Total_payment*0.1),null) AS PROFIT
FROM BOOKING,SERVICE,CALENDER
WHERE BOOKING.Booking_num = SERVICE.Booking_num
AND CALENDER.MONTH = EXTRACT(MONTH FROM Actual_end(+))
AND EXTRACT(MONTH FROM Actual_end) = 2018
GROUP BY CALENDER.MONTH
输出: 未选择任何行
【问题讨论】:
-
您需要制作一个称为日历表的东西或使用交付的表(我相信 oracle 在手册中将其称为内联视图),但不是存储日期,而是存储月份的数字。 . 将数据与该日历表或交付表在月份数上左连接时,您将获得这些缺失值
NULL -
限定列名,以便清楚列的来源!