簡體   English   中英

如何訪問 SQL 子查詢中的變量

[英]How can I access variables in subqueries in SQL

我創建了這個查詢來解決這個問題

SELECT c.ra as Day, round(count(cancelled) / Count(*),2) as "Cancellation Rate" FROM  
(
    select a.Id, a.ra, a.Status as status, b.Status as cancelled FROM 
    (
        select Id, Client_Id, Driver_Id, Status, Request_at as ra from Trips t
            where not exists 
            (
                select 1 from users u
                where (t.Client_Id = u.Users_Id or t.Driver_Id = u.Users_Id)
                and u.banned = 'Yes'
            )
    ) a LEFT JOIN 
    (
        select Id, Client_Id, Driver_Id, Status, Request_at as ra from Trips t
            where not exists 
            (
                select 1 from users u
                where (t.Client_Id = u.Users_Id or t.Driver_Id = u.Users_Id)
                and u.banned = 'Yes'
            ) and (t.Status = 'cancelled_by_driver' or t.status = 'cancelled_by_client')
    ) b on a.Id = b.Id
) c GROUP BY c.ra

為了使該查詢更簡潔,我將其更改為以下內容,但這不起作用。 所以,我的問題是,使此類查詢更簡潔的正確方法是什么?

SELECT c.ra as Day, round(count(cancelled) / Count(*),2) as "Cancellation Rate" FROM  
(
    select a.Id, a.ra, a.Status as status, b.Status as cancelled FROM 
    (
        select Id, Client_Id, Driver_Id, Status, Request_at as ra from ( 
            select * from Trips t
            where not exists 
            (
                select 1 from users u
                where (t.Client_Id = u.Users_Id or t.Driver_Id = u.Users_Id)
                and u.banned = 'Yes'
            )
        ) t1
    ) a LEFT JOIN 
    (
        select Id, Client_Id, Driver_Id, Status, Request_at as ra from t1
            WHERE (Status = 'cancelled_by_driver' or Status = 'cancelled_by_client')
    ) b on a.Id = b.Id
) c GROUP BY c.ra

如果我理解正確,我只會使用條件聚合:

SELECT Date(request_at) AS Day, 
       Round(Avg(status IN ( 'cancelled_by_driver', 
                             'cancelled_by_client' )), 2) AS 
       "Cancellation Rate" 
FROM   trips t 
WHERE  NOT EXISTS (SELECT 1 
                   FROM   users u 
                   WHERE  u.users_id IN ( t.client_id, t.driver_id ) 
                          AND u.banned = 'Yes') 
GROUP  BY day; 

在你的第二個版本t1根本沒有定義。 如果您想以這種方式重用子查詢,則需要使用 CTE:

with t1 as (
     . . .
    )
select . . .

然后您可以在查詢中多次引用t1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM