0

最も多くの旅行を行ったすべてのドライバーのライセンス番号(LicenseCardNo)を見つけます。これを実現するためのSQLselectステートメントを記述できません。あなたたちが助けることができれば幸いです。以下は私のテーブルとテーブル内の値に関するサンプルデータですか?これまでに行ったコードも添付しました。

 DRIVER(OwnerNo, LicenseCardNo,STATUS,)
 PRIMARY KEY(OwnerNo)
 UNIQUE(LicenseCardNo)
 FOREIGN KEY(OwnerNo) REFERENCES EMPLOYEE(OwnerNo)
 CHECK ( STATUS IN ('MAIN DRIVER', 'DRIVER', 'TAXI DRIVER')) )

 ( A29, DR1, 'MAIN DRIVER' )
 ( A28, DR2, 'MAIN DRIVER' )
 ( A25, DR3, 'TAXI DRIVER' )
 ( A25, DR22, 'DRIVER' )
 ( A20, DR6, 'DRIVER' )
 ( A23, DR7, 'TAXI DRIVER' )
 ( A30, DR8, 'TAXI DRIVER' )

TRIP( TripNo,LicenseCardNo,CarReg,TRIP_DATE,)
PRIMARY KEY (TripNo),
FOREIGN KEY (LicenseCardNo) REFERENCES DRIVER(LicenseCardNo),
FOREIGN KEY (CarReg) REFERENCES TRUCK(CarReg)

( 1, DR1, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-135 )
( 2, DR2, 'GBC222', ADD_MONTHS(TRUNC(SYSDATE),0)-135 )
( 3, DR1, 'GBC270', ADD_MONTHS(TRUNC(SYSDATE),0)-133 )
( 4, DR3, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-130 )
( 5, DR22, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-130 )
( 6, DR22, 'GBC222', ADD_MONTHS(TRUNC(SYSDATE),0)-124 )
( 7, DR7, 'KKK007', ADD_MONTHS(TRUNC(SYSDATE),0)-123 )
( 8, DR1, 'SJG123', ADD_MONTHS(TRUNC(SYSDATE),0)-123 )
( 9, DR2, 'QRT834', ADD_MONTHS(TRUNC(SYSDATE),0)-123 )
(10, DR22, 'GBC270', ADD_MONTHS(TRUNC(SYSDATE),0)-122 )

これは私がどこまで行けるかです。続行する方法がわかりません。私はインターネットの助けを借りてこれを達成することができました。お知らせ下さい。

SELECT DRIVER.LicenseCardNo AS LICENSE_NO, COUNT(TRIP.TripNo) AS TOTAL_NO_TRIPS
FROM DRIVER LEFT OUTER JOIN TRIP ON DRIVER.LicenseCardNo = TRIP.LicenseCardNo
GROUP BY DRIVER.LicenseCardNo
ORDER BY DRIVER.LicenseCardNo;

このコードは、各ドライバーが移動した旅行の数をリストします。

そこで、最も多くの旅行を行ったすべてのドライバーのライセンス番号(LicenseCardNo)を見つける必要があります。

4

1 に答える 1

2

あなたはそこに向かっているところです。Oracle の分析関数を使用する 1 つの方法を次に示します。

with q as (
    SELECT DRIVER.LicenseCardNo AS LICENSE_NO, COUNT(TRIP.TripNo) AS TOTAL_NO_TRIPS
    FROM DRIVER LEFT OUTER JOIN TRIP ON DRIVER.LicenseCardNo = TRIP.LicenseCardNo
    GROUP BY DRIVER.LicenseCardNo
)
select licenseCardNo
from (select q.*, rank() over (order by Total_No_Trips order by 1 desc) as ranking
      from q
     ) q1
where ranking = 1
ORDER BY LicenseCardNo;

実際、元のクエリが不必要に複雑であることも認識しています。ライセンス番号を持っているので、DRIVER に戻す必要はありません。これは次のように表現できます。

select licenseCardNo
from (select q.*, rank() over (order by Total_No_Trips order by 1 desc) as ranking
      from (select LicenseCardNo, count(*) as Total_No_Trips
            from trips t
            group by LicenseCardNo
           ) q
     ) q1
where ranking = 1
ORDER BY LicenseCardNo;

また、出力の最初に最大数を表示したい場合は、次のようにします。

order by 2 desc

元のクエリで。これは、ライセンス カード番号ではなく、カウント順に並べ替えられます。

これを行う別の (そして通常はあまり効率的ではない) 方法は、group by/join アプローチを使用することです。

with q as (
    select LicenseCardNo, count(*) as Total_No_Trips
    from trips t
    group by LicenseCardNo
)
select q.*
from q
where Total_No_Trips = (select max(Total_No_Trips) from q)
于 2012-11-10T16:42:21.067 に答える