Re: Relation Query and Duplicates
From: Tokunaga T. <tonkuma_at_jp.ibm.com>
Date: 9 Jul 2002 03:49:40 -0700
Message-ID: <8156d9ae.0207090249.c313d25_at_posting.google.com>
ORDER BY userid DESC, date, seq
!
ORDER BY UserID DESC, Date, Userid_date DESC, Seq !
Month: July, 2002
UserID: Linda
Date: July 1, 2002
UserID: John
Date: July 1, 2002
Date: 9 Jul 2002 03:49:40 -0700
Message-ID: <8156d9ae.0207090249.c313d25_at_posting.google.com>
> > My problem is that the number of records from the overhead table and > job table are different for a specific Day. >
- One way to resolve this problem is to use row_number() function and FULL OUTER JOIN. Following example was tested in DB2 UDB V7.2 Fixpak7.
SELECT coalesce(J.userid, O.userid) AS userid
,coalesce(J.date, O.date) AS date
,jobdescription, Jobhours, overheaddescription,
overheadhours
,coalesce(J.seq, O.seq) AS seq
FROM (SELECT userid, date, jobdescription, Jobhours ,rownumber() over(partition by userid, date order by jobhours DESC) as seq FROM Job_hours WHERE year(date) = 2002 AND month(date) = 7 ) AS J FULL OUTER JOIN (SELECT userid, date, overheaddescription, overheadhours ,rownumber() over(partition by userid, date order by overheadhours DESC) as seq FROM Overhead_hours WHERE year(date) = 2002 AND month(date) = 7 ) AS O ON J.userid = O.userid AND J.date = O.date AND J.seq = O.seq
ORDER BY userid DESC, date, seq
!
USERID DATE JOBDESCRIPTION JOBHOURS OVERHEADDESCRIPTION OVERHEADHOURS SEQ
------------ ---------- --------------- -------- ------------------- ------------- -------------------- Linda 2002-07-01 Welding 3.0 Clean-up 0.5 1 Linda 2002-07-01 Machining 1.5 - - 2 Linda 2002-07-02 Welding 3.0 - - 1 Linda 2002-07-03 - - Sick 7.5 1 John 2002-07-01 Sanding 2.0 Clean-up 0.5 1 John 2002-07-01 Machining 1.5 - - 2 John 2002-07-02 Welding 3.0 - - 1 John 2002-07-03 - - Course 7.5 1
2. It will be rather complicated to format output as you showed. This is one example and you could make simpler. But I do not know how at now.
SELECT char(Userid_date,30) "UserID and Date" ,JobDescription "Job Description" ,JobHours "Job Hours" ,OverheadDescription "Overhead Description" ,OverheadHours "Overhead Hours" FROM (SELECT CASE WHEN grouping(UserID) = 1 THEN 'Month: ' || monthname(max(Date)) || ', ' || char(year(max(Date))) WHEN grouping(Date) = 1 THEN ' UserID: ' || UserID WHEN grouping(Seq) = 1 THEN ' Date: ' || monthname(max(Date)) || ' ' || rtrim(char(day(max(Date)))) || ', ' || char(year(max(Date))) ELSE '' END Userid_date
,CASE
WHEN grouping(Seq) = 1 THEN '' ELSE max(JobDescription) END JobDescription
,CASE
WHEN grouping(Seq) = 1 THEN '' ELSE substr(' ',1,2-int(log10(max(JobHours)))) || substr(char(max(JobHours)),2-int(log10(max(JobHours)))) END JobHours
,CASE WHEN grouping(Seq) = 1 THEN '' ELSE
max(OverheadDescription) END OverheadDescription
,CASE
WHEN grouping(Seq) = 1 THEN '' ELSE substr(' ',1,2-int(log10(max(OverheadHours)))) || substr(char(max(OverheadHours)),2-int(log10(max(OverheadHours)))) END OverheadHours
,max(UserID) UserID
,min(Date) Date
,Seq
FROM (SELECT coalesce(J.UserID, O.UserID) AS UserID ,coalesce(J.Date, O.Date ) AS Date ,JobDescription, JobHours, OverheadDescription, OverheadHours ,coalesce(J.Seq, O.Seq ) AS Seq FROM (SELECT UserID, Date, JobDescription, JobHours ,rownumber() over(PARTITION BY UserID, Date ORDER BY JobHours DESC) as Seq FROM Job_hours WHERE year(Date) = 2002 AND month(Date) = 7 ) AS J FULL OUTER JOIN (SELECT UserID, Date, OverheadDescription, OverheadHours ,rownumber() over(PARTITION BY UserID, Date ORDER BY OverheadHours DESC) as Seq FROM Overhead_hours WHERE year(Date) = 2002 AND month(Date) = 7 ) AS O ON J.UserID = O.UserID AND J.Date = O.Date AND J.Seq = O.Seq ) AS Q GROUP BY GROUPING SETS( (UserID,Date,Seq), (UserID,Date), (UserID), () ) ) AS P
ORDER BY UserID DESC, Date, Userid_date DESC, Seq !
UserID and Date Job Description Job Hours OverheadDescription Overhead Hours
------------------------------ --------------- --------- -------------------- --------------
Month: July, 2002
UserID: Linda
Date: July 1, 2002
Welding 3.0 Clean-up 0.5 Machining 1.5 - - Date: July 2, 2002 Welding 3.0 - - Date: July 3, 2002 - - Sick 7.5
UserID: John
Date: July 1, 2002
Sanding 2.0 Clean-up 0.5 Machining 1.5 - - Date: July 2, 2002 Welding 3.0 - - Date: July 3, 2002 - - Course 7.5Received on Tue Jul 09 2002 - 12:49:40 CEST