合并两个不同的查询

Combine two different queries

我有这个查询:

select 
    CLIENTS.ID,
    CLIENTS.FIRST_NAME || ' ' || CLIENTS.LAST_NAME as PATIENT,
    CLIENTS.PAYMENT_TYPE_ID as PAYMENT_TYPE,
    sum(SESSIONS.PRICE) as PRICE,
    sum(SESSIONS.AMOUNT) as PAID,
    sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) as DIF
from 
    SESSIONS SESSIONS,
    CLIENTS CLIENTS 
where 
    SESSIONS.CLIENTS_ID = CLIENTS.ID 
    and SESSIONS.STATUS in (4,5)
having 
    sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) <> 0
group by 
    CLIENTS.ID, CLIENTS.FIRST_NAME || ' ' || CLIENTS.LAST_NAME, CLIENTS.PAYMENT_TYPE_ID
order by 
    sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) desc

结果是:

我也有这个疑问:

SELECT 
    TRUNC(CURRENT_TIMESTAMP) - TRUNC(SESSION_DATE) AS total_unpaid_days, 
    TO_CHAR(SESSION_DATE, 'DD/MM/YYYY') AS first_unplaid_date
FROM  
    SESSIONS
WHERE
    CLIENTS_ID = 7
    AND STATUS = 5
    AND PAYMENT_STATUS = 1
ORDER BY 
    SESSIONS.ID ASC
FETCH FIRST 1 ROWS ONLY

但是如您所见,我必须手动提供 clients_id

是否可以合并这两个查询并在我的第一个查询中添加两个包含第二个查询结果的新列?

我试着这样写:

    select CLIENTS.ID,
        CLIENTS.FIRST_NAME || ' ' || CLIENTS.LAST_NAME as PATIENT,
        CLIENTS.PAYMENT_TYPE_ID as PAYMENT_TYPE,
 TRUNC(CURRENT_TIMESTAMP) - TRUNC(SESSION_DATE) as total_unpaid_days, 
        to_char(SESSION_DATE, 'DD/MM/YYYY') as first_unplaid_date,
        sum(SESSIONS.PRICE) as PRICE,
        sum(SESSIONS.AMOUNT) as PAID,
        sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) as DIF
     from SESSIONS SESSIONS,
        CLIENTS CLIENTS 
     where SESSIONS.CLIENTS_ID=CLIENTS.ID 
     and SESSIONS.STATUS in (4,5)
     having sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) <>0
     group by CLIENTS.ID, CLIENTS.FIRST_NAME || ' ' || CLIENTS.LAST_NAME, CLIENTS.PAYMENT_TYPE_ID, TRUNC(CURRENT_TIMESTAMP) - TRUNC(SESSION_DATE), to_char(SESSION_DATE, 'DD/MM/YYYY')
     order by sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) desc

但是我得到的客户没有金额....

我认为这应该可行:

Select CLIENTS.ID,
    CLIENTS.FIRST_NAME || ' ' || CLIENTS.LAST_NAME as PATIENT,
    CLIENTS.PAYMENT_TYPE_ID as PAYMENT_TYPE,
    Sum(SESSIONS.PRICE) as PRICE,
    Sum(SESSIONS.AMOUNT) as PAID,
    Sum(SESSIONS.PRICE) - Sum(SESSIONS.AMOUNT) as DIF,
        
    (SELECT TRUNC(CURRENT_TIMESTAMP) - TRUNC(SESSION_DATE)      
     FROM  SESSIONS
     Where CLIENTS_ID = CLIENTS.ID AND
           STATUS = 5 AND
           PAYMENT_STATUS = 1 AND
           RowNum = 1
     Order By SESSIONS.ID ASC) AS total_unpaid_days,
     
    (SELECT To_Char(SESSION_DATE, 'DD/MM/YYYY') 
     FROM  SESSIONS
     Where CLIENTS_ID = CLIENTS.ID AND
           STATUS = 5 AND
           PAYMENT_STATUS = 1 AND
           RowNum = 1
     Order By SESSIONS.ID ASC) AS first_unplaid_date

    
 From SESSIONS SESSIONS
 Join CLIENTS CLIENTS ON SESSIONS.CLIENTS_ID=CLIENTS.ID 
 where SESSIONS.STATUS in (4,5)
 Having Sum(SESSIONS.PRICE) - Sum(SESSIONS.AMOUNT) <> 0
 Group By CLIENTS.ID, CLIENTS.FIRST_NAME || ' ' || CLIENTS.LAST_NAME, CLIENTS.PAYMENT_TYPE_ID
 Order By Sum(SESSIONS.PRICE) - Sum(SESSIONS.AMOUNT) Desc

找到了!

select p.ID as P_ID,
    p.FIRST_NAME || ' ' || p.LAST_NAME as PATIENT,
    p.PAYMENT_TYPE_ID as PAYMENT_TYPE, tm.First_Unpaid_date, Owes_days, Charge, Paid, Diff
    from CLIENTS p
        inner join SESSIONS s on p.ID = s.CLIENTS_ID
    inner join (
        select CLIENTS_ID,
            max(TRUNC(CURRENT_TIMESTAMP) - TRUNC(SESSION_DATE)) as Owes_days,
            sum(SESSIONS.PRICE) as Charge,
            sum(SESSIONS.AMOUNT) as Paid,
            sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) as Diff,
            min(SESSION_DATE) as First_Unpaid_date
        from SESSIONS
        where PAYMENT_STATUS = 1
        and STATUS in (4,5)
        having sum(SESSIONS.PRICE) - sum(SESSIONS.AMOUNT) <>0
        group by CLIENTS_ID
    ) tm on p.ID = tm.CLIENTS_ID and s.SESSION_DATE = tm.First_Unpaid_date
    and s.PAYMENT_STATUS = 1
    and s.STATUS in (1,5)