[英]How to group two tables by different columns?
I have a table of trip with license number and trip date. 我有一张带许可证号码和旅行日期的旅行表。 Beside this, I have table of license which is licence number and name of the driver. 除此之外,我还有许可证表,即许可证号码和驱动程序名称。 I want to create a report which is full names of drivers together with the average number of trips made per year. 我想创建一份报告,其中包括司机的全名以及每年的平均出行次数。 Consider the years 1995, 1996, and 1997. This is getting so complex: 考虑1995年,1996年和1997年。这变得如此复杂:
To group the records by year in trip table I did this which works fine: 为了在旅行表中按年分组记录,我做了这个工作正常:
SELECT TO_CHAR(TRIP_DATE, 'YYYY') AS year, count(1) trips
FROM TRIP tr join driver d on (d.l# = tr.l#)
join employee e on (e.e# = d.e#)
GROUP BY TO_CHAR(TRIP_DATE, 'YYYY');
Output: 输出:
YEAR TRIPS
---- ----------
1997 7
1995 12
1996 13
1999 2
1998 1
But when I wan to add the second table and again group them by each driver it is not working: 但是,当我想添加第二个表并再次按每个驱动程序对它们进行分组时,它不起作用:
SELECT TO_CHAR(TRIP_DATE, 'YYYY') AS year, e.fname, e.lname , count(1) trips
FROM TRIP tr join driver d on (d.l# = tr.l#)
join employee e on (e.e# = d.e#)
GROUP BY TO_CHAR(TRIP_DATE, 'YYYY'),e.fname, e.lname;
As you can see here I have three tables. 正如你在这里看到的,我有三张桌子。 licence number is having foreig key with emplyee with full name. 许可证号码是带有全名的emplyee的foreig键。
Output: 输出:
YEAR FNAME
---- --------------------------------------------------
LNAME TRIPS
-------------------------------------------------- ----------
1997 John
Lucas 2
1999 Adam
Taylor 1
1995 John
Doe 2
Expected output: 预期产量:
YEAR TRIPS
---- ----------
1997 7
john avg=3.2;
mat avg=4.2;
1995 12
john avg=3.2;
mat avg=4.2;
1996 13
john avg=3.2;
mat avg=4.2;
1999 2
john avg=3.2;
mat avg=4.2;
1998 1
john avg=3.2;
mat avg=4.2;
I have some issues with my decimal number so I didn't tested totally AVG, I did 2 queries for you, try it. 我的十进制数有问题,所以我没有完全测试AVG,我为你做了2次查询,试试看。
SELECT
TotalTripsByYear.year
,TotalTripsByYear.trips as totalTripsOfYear
,fullname
,avg_trips as avgTripsOfDriverByYear
FROM
(SELECT
TO_CHAR(TRIP_DATE, 'YYYY') AS year
,count(*) trips
FROM
TRIP tr
join driver d
on (d.l# = tr.l#)
join employee e
on (e.e# = d.e#)
GROUP BY TO_CHAR(TRIP_DATE, 'YYYY')) TotalTripsByYear
left join (SELECT
year
,e.fname ||' ' || e.lname as fullname
,AVG(trips) as avg_trips
FROM
(SELECT
TO_CHAR(TRIP_DATE, 'YYYY') AS year
,d.e#
,count(*) trips
FROM
TRIP tr
join driver d
on (d.l# = tr.l#)
GROUP BY
TO_CHAR(TRIP_DATE, 'YYYY')
,d.e#) TotalTripsByDriversByYear
INNER JOIN employee e
on TotalTripsByDriversByYear.e# = e.e#
GROUP BY
year
,e.fname||' ' || e.lname) AvgTripsByDriversByYear
on AvgTripsByDriversByYear.year = TotalTripsByYear.year
SELECT
TotalTripsByYear.year
,TotalTripsByYear.trips as totalTripsOfYear
,fullname
,avg_trips as avgTripsOfDriverByYear
FROM
(SELECT
TO_CHAR(TRIP_DATE, 'YYYY') AS year
,count(*) trips
FROM TRIP tr
join driver d
on (d.l# = tr.l#)
join employee e
on (e.e# = d.e#)
GROUP BY
TO_CHAR(TRIP_DATE, 'YYYY')) TotalTripsByYear
left join (SELECT
TotalTripsByDriversByYear.year
,e.fname ||' ' || e.lname as fullname
,TotalTripsByDriversByYear.trips / totalTripsByYear.total as avg_trips
FROM
(SELECT
TO_CHAR(TRIP_DATE, 'YYYY') AS year
,d.e#
,count(*) trips
FROM
TRIP tr
join driver d on (d.l# = tr.l#)
GROUP BY
TO_CHAR(TRIP_DATE, 'YYYY')
, d.e#) TotalTripsByDriversByYear
INNER JOIN (SELECT
TO_CHAR(TRIP_DATE, 'YYYY') as year
, COUNT(*) as total
FROM TRIP
GROUP BY TO_CHAR(TRIP_DATE, 'YYYY')) as totalTripsByYear
on TotalTripsByDriversByYear.year = totalTripsByYear.year
INNER JOIN employee e
on TotalTripsByDriversByYear.e# = e.e#
) AvgTripsByDriversByYear
on AvgTripsByDriversByYear.year = TotalTripsByYear.year
SELECT TO_CHAR(TRIP_DATE, 'YYYY') AS year, e.fname||' ' || e.lname , count(1) trips
FROM TRIP tr join driver d on (d.l# = tr.l#)
join employee e on (e.e# = d.e#)
GROUP BY TO_CHAR(TRIP_DATE, 'YYYY'),e.fname||' ' || e.lname;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.