简体   繁体   English

如何按不同列对两个表进行分组?

[英]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次查询,试试看。

Using AVG function 使用AVG功能

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

Doing manual AVG 做手动AVG

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM