I've created multiple temp tables which I want to link together into one result set.
I've only been able to get the individual temp tables created using with clause, but don't know how to join them together. There are primary key field is file_id to join all three tables together.
WITH file_data AS (
SELECT fd.file_id, fd.receivedate, fd.datestart, fd.dateend
FROM trans_detail td join file_detail fd
on fd.receivedate between '1 Jun 2019' and '30 Jun 2019'
)
WITH tran_data AS (
SELECT fd.file_id, sum(td.tran_amt) as total_amt, sum(points) as
tran_points
FROM trans_detail td join file_detail fd
on td.date between fd.datestart and fd.dateend
group by fd.file_id
)
WITH adj_data AS (
SELECT fd.file_id, sum(ad.points) as adj_points
FROM adj_detail ad join file_detail fd
on adj.date between fd.datestart and fd.dateend
group by fd.file_id
)
expected result would be
file id receivedate datestart datesend total_amt tran_points adj_points
123 1 Jun 2019 31/05/2019 9:51:50 PM 1/06/2019 9:51:50 PM
You need to use WITH..SELECT
clause as following:
WITH FILE_DATA AS (
SELECT
FD.FILE_ID,
FD.RECEIVEDATE,
FD.DATESTART,
FD.DATEEND
FROM
TRANS_DETAIL TD
JOIN FILE_DETAIL FD ON FD.RECEIVEDATE BETWEEN '1 Jun 2019' AND '30 Jun 2019'
), TRAN_DATA AS (
SELECT
FD.FILE_ID,
SUM(TD.TRAN_AMT) AS TOTAL_AMT,
SUM(POINTS) AS TRAN_POINTS
FROM
TRANS_DETAIL TD
JOIN FILE_DETAIL FD ON ( TD."DATE" BETWEEN fd.datestart and fd.dateend)
GROUP BY FD.FILE_ID
), ADJ_DATA AS (
SELECT
FD.FILE_ID,
SUM(AD.POINTS) AS ADJ_POINTS
FROM
ADJ_DETAIL AD
JOIN FILE_DETAIL FD
on (ADJ."DATE" BETWEEN FD.DATESTART AND FD.DATEEND) group BY FD.FILE_ID )
--
SELECT <COLUMNS YOU WANT IN SELECT LIST> -- PUT ALL COLUMNS WHICH YOU WANT IN OUTPUT
FROM
FILE_DATA FD
JOIN TRAN_DATA TD
ON ( FD.FILE_ID = TD.FILE_ID ) -- YOU CAN USE OUTER JOIN ACCORDING TO YOUR REQUIREMENT
JOIN ADJ_DATA AD
ON ( FD.FILE_ID = AD.FILE_ID ) -- YOU CAN USE OUTER JOIN ACCORDING TO YOUR REQUIREMENT
WHERE <PUT WHERE CONDITION HERE, IF ANY>
And don't use oracle reserved words as any object name. You have used the DATE
as column name which is oracle reserved word. Try to rename this column.
Cheers!!
This is how you can achieve (check the joins)
WITH file_data AS (
SELECT fd.file_id, fd.receivedate, fd.datestart, fd.dateend
FROM trans_detail td join file_detail fd
on fd.receivedate between '1 Jun 2019' and '30 Jun 2019'
)
, tran_data AS (
SELECT fd.file_id, sum(td.tran_amt) as total_amt, sum(points) as
tran_points
FROM trans_detail td join file_detail fd
on td.date between fd.datestart and fd.dateend
group by fd.file_id
)
,adj_data AS (
SELECT fd.file_id, sum(ad.points) as adj_points
FROM adj_detail ad join file_detail fd
on adj.date between fd.datestart and fd.dateend
group by fd.file_id
)
select *
from file_data f
join tran_data t on t.file_id = f.file_id
join adj_data a on a.file_id = f.file_id
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.