Sql 从三个单独的表中提取数据的一些问题
有人向我提出了一个问题: 编写一个SQL命令,为每个拥有总计 所有行程的距离超过100,员工姓名, 员工在所有行程中使用的总升数。(修订) 行程的升数是距离Inkm除以每升公里数。) 对于以下数据集: 我或多或少碰到了一堵砖墙。我之前有一个类似的问题,最终有一个用户告诉我用一个内部联接来解决这个问题,从那以后我一直在这样做,但这个问题唯一要求的是来自所有三个表的数据。这是我的解决方案:Sql 从三个单独的表中提取数据的一些问题,sql,Sql,有人向我提出了一个问题: 编写一个SQL命令,为每个拥有总计 所有行程的距离超过100,员工姓名, 员工在所有行程中使用的总升数。(修订) 行程的升数是距离Inkm除以每升公里数。) 对于以下数据集: 我或多或少碰到了一堵砖墙。我之前有一个类似的问题,最终有一个用户告诉我用一个内部联接来解决这个问题,从那以后我一直在这样做,但这个问题唯一要求的是来自所有三个表的数据。这是我的解决方案: SELECT DISTINCT E.NAME, sum(T.distanceInKM/C.kmPerLitr
SELECT DISTINCT E.NAME, sum(T.distanceInKM/C.kmPerLitre)
FROM Employe E, TravelCost T, CAR C
GROUP BY T.distanceInKm,E.name,C.kmPerLitre
HAVING SUM(distanceInKM) > 100;
(请忽略小的差异;我的Employee表名为Employe,我的distanceSinceService列名为“distance”)
但这给了我绝对疯狂的输出,我不知道到底发生了什么。我们在课堂上做了一些分组练习,但没有一个比这更难,所以我有点被卡住了。这是一个加入表格的版本,应该会给你带来你想要的
SELECT E.NAME
, SUM(T.distanceInKM/C.kmPerLitre) AS NumLitres
, SUM(T.distanceInKM) AS TotalDistanceInKm
FROM Employe E
INNER
JOIN TravelCost T
ON E.id = T.employeeId
INNER
JOIN CAR C
ON T.carRegNo = C.regNo
GROUP
BY E.name
HAVING SUM(T.distanceInKM) > 100
;
希望这对您有所帮助这是一个连接您的表的版本,应该能满足您的期望
SELECT E.NAME
, SUM(T.distanceInKM/C.kmPerLitre) AS NumLitres
, SUM(T.distanceInKM) AS TotalDistanceInKm
FROM Employe E
INNER
JOIN TravelCost T
ON E.id = T.employeeId
INNER
JOIN CAR C
ON T.carRegNo = C.regNo
GROUP
BY E.name
HAVING SUM(T.distanceInKM) > 100
;
希望这有帮助像这样尝试:
DECLARE @Employee TABLE(id INT,name VARCHAR(100));
INSERT INTO @Employee VALUES
(1,'Smith')
,(2,'Patel')
,(6,'Bennett')
,(7,'Booch');
DECLARE @Car TABLE(regNo VARCHAR(100),distanceSinceService INT,kmPerLitre FLOAT);
INSERT INTO @Car VALUES
('FF06DDS',122,10)
,('EE07SSA',110,8)
,('FG07BAK',165,7)
,('HH08BBW',0,12);
DECLARE @TravelCost TABLE(jouneyID INT,carRegNo VARCHAR(100),employeeID INT,occured DATE,distanceInKm FLOAT);
INSERT INTO @TravelCost VALUES
(4,'FF06DDS',1,{d'2007-07-11'},90)
,(6,'FG07BAK',2,{d'2007-07-21'},110)
,(11,'EE07SSA',6,{d'2007-07-21'},110)
,(12,'FF06DDS',1,{d'2007-09-05'},32)
,(21,'FG07BAK',7,{d'2007-09-05'},55);
SELECT e.name AS Employee
,SUM(tc.distanceInKm) AS SumKm
,SUM(tc.distanceInKm/c.kmPerLitre) AS UsedGasoline
FROM @TravelCost AS tc
INNER JOIN @Car AS c ON tc.carRegNo=c.regNo
INNER JOIN @Employee AS e ON tc.employeeID=e.id
GROUP BY e.name
HAVING SUM(tc.distanceInKm)>100;
结果
Employee SumKm UsedGasoline
Bennett 110 13,75
Patel 110 15,71
Smith 122 12,2
试着这样做:
DECLARE @Employee TABLE(id INT,name VARCHAR(100));
INSERT INTO @Employee VALUES
(1,'Smith')
,(2,'Patel')
,(6,'Bennett')
,(7,'Booch');
DECLARE @Car TABLE(regNo VARCHAR(100),distanceSinceService INT,kmPerLitre FLOAT);
INSERT INTO @Car VALUES
('FF06DDS',122,10)
,('EE07SSA',110,8)
,('FG07BAK',165,7)
,('HH08BBW',0,12);
DECLARE @TravelCost TABLE(jouneyID INT,carRegNo VARCHAR(100),employeeID INT,occured DATE,distanceInKm FLOAT);
INSERT INTO @TravelCost VALUES
(4,'FF06DDS',1,{d'2007-07-11'},90)
,(6,'FG07BAK',2,{d'2007-07-21'},110)
,(11,'EE07SSA',6,{d'2007-07-21'},110)
,(12,'FF06DDS',1,{d'2007-09-05'},32)
,(21,'FG07BAK',7,{d'2007-09-05'},55);
SELECT e.name AS Employee
,SUM(tc.distanceInKm) AS SumKm
,SUM(tc.distanceInKm/c.kmPerLitre) AS UsedGasoline
FROM @TravelCost AS tc
INNER JOIN @Car AS c ON tc.carRegNo=c.regNo
INNER JOIN @Employee AS e ON tc.employeeID=e.id
GROUP BY e.name
HAVING SUM(tc.distanceInKm)>100;
结果
Employee SumKm UsedGasoline
Bennett 110 13,75
Patel 110 15,71
Smith 122 12,2
试试这个。实际上,我不确定它是否通过了语法检查,但如果通过了-耶!:D
SELECT e.Name,
sum(t.DistanceInKm) DistanceInKm,
sum(t.DistanceInKm) / c.KmPerLitre FuelSpent
FROM TravelCost t JOIN Employee e ON t.EmployeeId = e.Id
JOIN Car c ON t.CarRegNo = c.RegNo
GROUP BY e.Name, c.KmPerLitre
HAVING sum(t.DistanceInKm) > 100;
试试这个。实际上,我不确定它是否通过了语法检查,但如果通过了-耶!:D
SELECT e.Name,
sum(t.DistanceInKm) DistanceInKm,
sum(t.DistanceInKm) / c.KmPerLitre FuelSpent
FROM TravelCost t JOIN Employee e ON t.EmployeeId = e.Id
JOIN Car c ON t.CarRegNo = c.RegNo
GROUP BY e.Name, c.KmPerLitre
HAVING sum(t.DistanceInKm) > 100;
您的sql语句没有真正连接任何列上的表。我不知道是否可以将3个表连接在一起。通过稍微修改我的表格,我可以让它返回行程超过100公里的员工的ID,但我不确定如何正确获得每公里升数的平均值。请务必说明RDBMS(供应商和版本),请不要将样本数据粘贴为图片。这使得设置场景变得非常困难…对此表示抱歉。无论如何,我想我已经解决了我自己的问题,不确定我得到的数据是否正确。我确信我找到了正确的员工,但我没有时间检查这是否正确。因此,我将谨慎地回答我自己的问题。一般来说,当涉及到GROUP BY时:不用于设置函数的参数的选定列是应该在GROUP BY子句中列出的列。您的sql语句并没有真正连接任何列上的表。我不知道是否可以将3个表连接在一起。通过稍微修改我的表格,我可以让它返回行程超过100公里的员工的ID,但我不确定如何正确获得每公里升数的平均值。请务必说明RDBMS(供应商和版本),请不要将样本数据粘贴为图片。这使得设置场景变得非常困难…对此表示抱歉。无论如何,我想我已经解决了我自己的问题,不确定我得到的数据是否正确。我确信我找到了正确的员工,但我没有时间检查这是否正确。因此,我将谨慎地回答我自己的问题。一般来说,当涉及到GROUP BY时:不用于设置函数的参数的选定列是应该在GROUP BY子句中列出的列。是的,刚刚注意到我的ommitted Smith,可能是由于不必要的GROUP BY。我会选择这个作为正确答案,并删除我自己的答案。你比我快:-)+1从我这边我不确定这是否正确,因为你不想以每升c.Km求和。是的,刚刚注意到我的答案是史密斯,可能是因为不必要的分组。我会选择这个作为正确答案,并删除我自己的答案。你比我快:-)+1从我这边我不确定这是否正确,因为你不想以每升c.Km求和。