合并两个不同的查询
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)
我有这个查询:
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)