2017-01-22 91 views
-1

私はリビジョンの目的でSQLの質問に答えようとしていますが、動作させる方法を考え出すことはできません。問題のテーブルは以下のとおりです。SQLサブクエリの選択で悩む

Tables in question

質問は従業員の名前と合計数、100以上のすべての旅からの総距離が各従業員のために、ディスプレイにSQLコマンドを記述するために私を求めていますすべての旅で従業員が使用したリットル(旅のリットル数はdistanceInKm/kmPerLitreです)。

は、これまでのところ私は始まるコードのいくつかのバリエーションを試してみた:

それは私が少し動けなく、この時点でです
SELECT 
    name, TravelCost.distanceInKm/Car.kmPerLitre AS "Cost in Litres" 
FROM 
    Employee, Car, TravelCost 
WHERE 
    Employee.id = TravelCost.employeeID 
    AND Car.regNo = TravelCost.carRegNo 

、任意の助けをいただければ幸いです、ありがとう!

+0

互換性のないデータベースタグを削除しました。実際に使用しているデータベースにタグを付けてください。 –

+0

[古いスタイルのJOINを使用して蹴るのが悪い](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - ANSI - ** 92 ** SQL標準(** 25年**前)のold * style *カンマ区切りのテーブル*スタイルのリストが*適切な* ANSI 'JOIN'構文に置き換えられました。使用はお勧めしません –

答えて

3

決して使用コンマ。 常には、適切で標準的で明示的なJOIN構文を使用します。

あなたはGROUP BYHAVINGが欠落しています

SELECT e.name, SUM(tc.distanceInKm/c.kmPerLitre) AS "Cost in Litres" 
FROM Employee e JOIN 
    TravelCost tc 
    ON e.id = tc.employeeID JOIN 
    Car c 
    ON c.regNo = tc.carRegNo 
GROUP BY e.name 
HAVING SUM(tc.distanceInKm) > 100; 
+0

ありがとう、完璧に動作します、私は以前と非常によく似た何かを試してみましたが、SELECT句でSUMを逃していました。 – Tom

+0

CTEを使用した基準のグループ化されたデータと結合した場合や、 –

1

使用グループ化し、Having句FROM句で

SELECT NAME, 
     Sum(TravelCost.distanceInKm/ Car.kmPerLitre) AS "Cost in Litres" 
FROM Employee 
     INNER JOIN TravelCost 
       ON Employee.id = TravelCost.employeeID 
     INNER JOIN Car 
       ON Car.regNo = TravelCost.carRegNo 
GROUP BY NAME 
HAVING Sum(distanceInKm) > 100 
1

あなたはすべてのテーブルをJOINと、このようなリットルの合計を見つける必要があります。

select 
    e.*, 
    sum(distanceInKm/c.kmPerLitre) litres 
from employee e 
inner join travelcost t 
on e.id = t.employeeId 
inner join car c 
on t.carRegNo = c.regNo 
group by e.id, e.name 
having sum(t.distanceInKm) > 100; 

また、あなたがidでグループに必要他の答えが示唆しているように、名前の代わりに。同じ名前の複数の従業員が存在する可能性があります。

また、古いコンマベースの構文の代わりに明示的なJOIN構文を使用します。モダンで明快です。

-2
-- **How fool am I! How arrogant am I! I just thought `sum(tc.distanceInKm/c.kmPerLitre)` 
-- may have a problem, since a employee may have multiple cars,and car's kmPerLitre is differenct. 
-- However there is no problem, it's simple and right! 
-- The following is what I wrote, what a bloated statement it is! ** 

-- calcute the total number of litres used by the employee on all journeys 
select e.name, sum(Cost_in_Litres) as "Cost in Litres" 
from (
    select t.employeeID 
     -- calcute the litres used by the employee on all journeys group by carRegNo 
     , sum(t.distanceInKm)/avg(c.kmPerLitre) as Cost_in_Litres 
    from TravelCost t 
    inner join Car c 
     on c.regNo = t.carRegNo 
    where t.employeeID in 
    (-- find the employees who has a total distance from all journeys of more than 100 
    select employeeID 
     from TravelCost 
     group by employeeID 
     having sum(distanceInKm)> 100 
    ) 
    group by t.carRegNo, t.employeeID 
) a 
inner join Employee e 
    on e.id = a.employeeID 
group by e.id,e.name; 
関連する問題