SQL 未使用 ALIAS 列进行计算

SQL not using ALIAS column for calculation

问题陈述 - 从给定的出租车服务的行程和用户表中,编写查询 return 10 月前两天的取消率,四舍五入到小数点后两位,行程不涉及被禁止的乘客或司机。

关于 Oracle 的问题代码 SQL。

create table trips (trip_id int, rider_id int, driver_id int, status varchar2(200), request_date date);
insert into trips values (1, 1, 10, 'completed', to_date ('2020-10-01', 'YYYY/MM/DD'));
insert into trips values (2, 2, 11, 'cancelled_by_driver', to_date ('2020-10-01', 'YYYY/MM/DD'));
insert into trips values (3, 3, 12, 'completed', to_date ('2020-10-01', 'YYYY/MM/DD'));
insert into trips values (4, 4, 10, 'cancelled_by_driver', to_date ('2020-10-02', 'YYYY/MM/DD'));
insert into trips values (5, 1, 11, 'completed', to_date ('2020-10-02', 'YYYY/MM/DD'));
insert into trips values (6, 2, 12, 'completed', to_date ('2020-10-02', 'YYYY/MM/DD'));
insert into trips values (7, 3, 11, 'completed', to_date ('2020-10-03', 'YYYY/MM/DD'));

create table users (user_id int, banned varchar2(200), type varchar2(200));
insert into users values (1, 'no', 'rider');
insert into users values (2, 'yes', 'rider');
insert into users values (3, 'no', 'rider');
insert into users values (4, 'no', 'rider');
insert into users values (10, 'no', 'driver');
insert into users values (11, 'no', 'driver');
insert into users values (12, 'no', 'driver');

我的解决方案代码如下。但是,我收到以下错误。有人可以帮忙吗?

ORA-00904: "TOTAL_TRIPS": invalid identifier

解决方案代码:

select request_date, (1-(trips_completed/total_trips)) as "cancel_rate"
from
((
select request_date,
sum(case when status = 'completed' then 1 else 0 end) as "trips_completed",
sum(case when status = 'cancelled_by_driver' then 1 else 0 end) as "trips_cancelled",
sum(case when status = 'cancelled_by_driver' then 1 when status= 'completed' then 1 else 0 end) as "total_trips"
from 
(
select t.rider_id, t.driver_id, t.status, t.request_date, u.banned as "not_banned_rider", u.banned as "not_banned_driver"
from trips t
join users u
on t.rider_id=u.user_id
where u.banned='no'
)
group by request_date
having request_date <> to_date ('2020-10-03', 'YYYY/MM/DD')
));

首先,不要将标识符放在双引号中。他们只是把查询搞得一团糟。

其他一些需要解决的问题:

  • 不需要两级子查询。
  • 学习使用正确的 date 文字语法。
  • 我想你想要 < 而不是 <>

所以这表明:

select request_date, (1-(trips_completed/total_trips)) as cancel_rate
from (select request_date,
             sum(case when status = 'completed' then 1 else 0 end) as trips_completed,
             sum(case when status = 'cancelled_by_driver' then 1 else 0 end) as trips_cancelled,
             sum(case when status = 'cancelled_by_driver' then 1 when status = 'completed' then 1 else 0 end) as total_trips
      from trips t join
           users u
           on t.rider_id = u.user_id
      where u.banned = 'no' and
            t.request_date < date '2020-10-03'
      group by request_date 
     ) rd;

这可以使用 avg() 进一步简化:

select request_date,
       avg(case when status = 'completed' then 1 else 0 end) as cancel_rate
from trips t join
     users u
     on t.rider_id = u.user_id
where u.banned = 'no' and
      request_date < date '2020-10-03'
group by request_date ;

注意:这解决了修复问题中的查询问题。它实际上并没有正确回答问题,原因如下:

  • 我很确定这个问题涉及一个取消率,而不是两个日期一个。
  • 它没有考虑被禁止的驱动程序。
  • 我不确定如何处理“被用户取消”。

ORA-00904:“TOTAL_TRIPS”:标识符无效

就是说写的“total_trips”是无效的

只需使用 total_trips(不带引号)