0

私のプロジェクトでは、VehicleMaster、OwnerMaster、CustomerMaster、CustomerVehicle という 4 つのテーブルを使用しました。

名前が示すように、最初の 3 つはマスター テーブルで、最後のテーブル (CustomerVehicle) には CustomerID と VehicleID が含まれます。テーブル階層は次のとおりです。

 OwnerMaster (OwnerID, OwnerName) 
 VehicleMaster (VehicleID, OwnerID, VehicleDetails blah blah...) 
 CustomerMaster (CustomerID, CustomerName..) 
 CustomerVehicle     (CustomerID, VehicleID)

ここで、各所有者の下で何台の車両が走っているかを取得したいと思います。出力は次のようになります。

OwnerName, TotalVehicles, No of Running Vehicles, NonRunning Vehicles.
xxxx, 40, 34, 6

どんな助けでも大歓迎です。ありがとう、

4

3 に答える 3

1

このようなものが機能するはずです。テーブルを左結合し、(個別に) それぞれのフィールドを数えます。

SELECT om.OwnerName, 
       COUNT(DISTINCT vm.VehicleID) TotalVehicles, 
       COUNT(DISTINCT cv.VehicleID) Running, 
       COUNT(DISTINCT vm.VehicleID)-COUNT(DISTINCT cv.VehicleID) NotRunning
FROM OwnerMaster om
LEFT JOIN VehicleMaster vm ON om.OwnerID = vm.OwnerID
LEFT JOIN CustomerVehicle cv ON vm.VehicleID = cv.VehicleID
GROUP BY om.OwnerID, om.OwnerName

でテストする SQLfiddle

于 2013-10-07T19:35:36.427 に答える
0

車両を持たない所有者もいる可能性がありますが、わかりません...次のようなものも同様に機能するはずです。

SELECT 
  om.OwnerName,
  count(vm.VehicleID) Total,
  sum(case when vm.VehicleID is not null 
            and cv.VehicleID is not null then 1 else 0 end) Runnng,
  sum(case when vm.VehicleID is not null 
            and cv.VehicleID is null then 1 else 0 end) NotRunnng
FROM OwnerMaster om
LEFT JOIN VehicleMaster vm ON om.OwnerID = vm.OwnerID
LEFT JOIN CustomerVehicle cv ON vm.VehicleID = cv.VehicleID
GROUP BY om.OwnerName
于 2013-10-07T20:34:59.613 に答える
0

エルハナさん、ありがとうございます。クエリを更新して、必要な正確な結果を取得しました。次のように変更されたクエリ:

    SELECT 
    om.OwnerName,
    count(vm.VehicleID) Total,
    sum(case when vm.VehicleID is not null 
        and cv.VehicleID is not null then 1 else 0 end) Runnng,
     sum(case when vm.VehicleID is not null 
        and cv.VehicleID is null then 1 else 0 end) NotRunnng
    FROM OwnerMaster om
    LEFT JOIN VehicleMaster vm ON om.OwnerID = vm.OwnerID and vm.isactive = 1
    LEFT JOIN (select distinct VehicleID from CustomerVehicle where isactive = 1) cv
    ON vm.VehicleID = cv.VehicleID
    where om.isactive = 1
    GROUP BY om.OwnerName

SQL フィドル

于 2013-10-08T07:20:31.607 に答える