简体   繁体   English

SQL 不使用 ALIAS 列进行计算

[英]SQL not using ALIAS column for calculation

Question Statement - From the given trips and users tables for a taxi service, write a query to return the cancellation rate in the first two days in October, rounded to two decimal places, for trips not involving banned riders or drivers.问题陈述 - 从出租车服务的给定行程和用户表中,编写查询以返回 10 月份前两天的取消率,四舍五入到小数点后两位,对于不涉及被禁止的乘客或司机的行程。

Question code on Oracle SQL. 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');

My Solution Code is below.我的解决方案代码如下。 However, I get the following error.但是,我收到以下错误。 Can someone pleas help?有人可以帮忙吗?

ORA-00904: "TOTAL_TRIPS": invalid identifier

SOLUTION CODE:解决方案代码:

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')
));

First, don't put identifiers in double quotes.首先,不要将标识符放在双引号中。 They just clutter up queries.他们只是把查询弄得乱七八糟。

Some other things to fix:其他一些需要解决的问题:

  • No need for two levels of subqueries.不需要两个级别的子查询。
  • Learn to use proper date literal syntax.学习使用正确的date文字语法。
  • I think you want < rather than <> .我想你想要<而不是<>

So that suggests:所以这表明:

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;

This can be further simplified using avg() :这可以使用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 ;

Note: This addresses fixing the query in your question.注意:这解决了修复问题中的查询。 It doesn't actually correctly answer the question, for the following reasons:它实际上并没有正确回答这个问题,原因如下:

  • I'm pretty sure the question entails one cancellation rate, not one for two dates.我很确定这个问题需要一个取消率,而不是两个日期一个。
  • It doesn't take into account banned drivers.它没有考虑被禁止的司机。
  • I'm not sure how "cancelled by user" would be handled.我不确定如何处理“用户取消”。

ORA-00904: "TOTAL_TRIPS": invalid identifier ORA-00904: "TOTAL_TRIPS": 无效标识符

just means what is written "total_trips" is invalid只是意味着写的“total_trips”是无效的

Just use total_trips (without quote)只需使用 total_trips (不带引号)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM