Sql 按列分组对多个表求和

Sql 按列分组对多个表求和,sql,sql-server,group-by,sum,Sql,Sql Server,Group By,Sum,我有以下SQL Server表: create table Cars ( CarID int, CarType varchar(50), PlateNo varchar(20) ); create table Fuelings ( CarID int, FuelingDate date, Odometer int, Quantity decimal, Cost money ); create table Maintenances ( CarID int,

我有以下SQL Server表:

create table Cars
(
  CarID int,
  CarType varchar(50),
  PlateNo varchar(20)
);

create table Fuelings
(
  CarID int,
  FuelingDate date,
  Odometer int,
  Quantity decimal,
  Cost money
);

create table Maintenances
(
  CarID int,
  MaintenanceDate date,
  MaintenanceCost money
);
我在计算按列CarType分组的燃油消耗量时遇到问题。要获得燃油消耗量,我想计算每辆车的距离和燃油量,然后根据CarType列对其进行汇总

我现在所拥有的:

SELECT DISTINCT C.CarType AS [Car type],
SUM(M.MaintenanceCost) AS [Maintenance],
SUM(F.Cost) AS [Fuel],
(MAX(Odometer)-MIN(Odometer)) AS [Distance], 
(SUM(Quantity)*100)/(MAX(Odometer)-MIN(Odometer)) AS [L/100km]
FROM Cars AS C 
LEFT JOIN Maintenances AS M ON M.CarID=C.CarID 
      AND M.MaintenanceDate BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:29'
LEFT JOIN Fuelings AS F ON F.CarID=C.CarID 
      AND F.FuelingDate BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:29'
GROUP BY C.CarType
“SUV”类型的预期结果:

  • 燃油总量:301
  • 总距离:1600
  • 消费:188125

请参见此处:

我使用了一个公共表表达式
cte\u car
来进行第一次分组,并获得一辆车的所有详细信息。然后进行最后一次分组,以获得各车型的总数

样本数据

我遗漏了
Maintenances
表,因为消耗不需要它

create table Cars
(
  CarID int,
  CarType varchar(50),
  PlateNo varchar(20)
);

insert into Cars (CarID, CarType, PlateNo) values 
(1,'Coupe','BC18341'),
(2,'Hatchback','AU14974'),
(3,'Hatchback','BC49207'),
(4,'SUV','AU10299'),
(5,'Coupe','AU32703'),
(6,'Coupe','BC51719'),
(7,'Hatchback','AU30325'),
(8,'SUV','BC52018');

create table Fuelings
(
  CarID int,
  FuelingDate date,
  Odometer int,
  Quantity decimal,
  Cost money
);

insert into Fuelings (CarID, FuelingDate, Odometer, Quantity, Cost) values 
(1,'2021-01-02', 124520, 53.28, 78.32),
(1,'2021-01-15', 124810, 49.17, 68.34),
(1,'2021-01-28', 125130, 51.74, 69.13),
(2,'2021-01-05', 344380, 49.10, 72.81),
(2,'2021-01-18', 344540, 54.98, 69.37),
(2,'2021-01-29', 344990, 52.76, 66.83),
(3,'2021-01-01', 874200, 45.27, 73.48),
(3,'2021-01-19', 874770, 46.75, 67.91),
(3,'2021-01-26', 874930, 52.15, 75.50),
(4,'2021-01-03', 414190, 50.88, 71.72),
(4,'2021-01-14', 414400, 51.94, 68.15),
(4,'2021-01-29', 415140, 48.30, 77.82),
(5,'2021-01-06', 294240, 48.15, 71.48),
(5,'2021-01-19', 294680, 53.86, 66.80),
(5,'2021-01-30', 294890, 51.54, 74.31),
(6,'2021-01-01', 934220, 49.26, 69.98),
(6,'2021-01-18', 934520, 51.35, 71.50),
(6,'2021-01-25', 934970, 54.63, 65.72),
(7,'2021-01-05', 584110, 51.42, 74.29),
(7,'2021-01-22', 584430, 49.36, 69.95),
(7,'2021-01-31', 584750, 49.84, 73.18),
(8,'2021-01-02', 654280, 53.87, 77.75),
(8,'2021-01-17', 654730, 45.32, 67.48),
(8,'2021-01-29', 654930, 50.75, 69.80);
解决方案

with cte_car as
(
  select c.CarId,
         c.CarType,
         max(f.Odometer) - min(f.Odometer) as CarDistance,
         sum(f.Quantity) as CarQuantity
  from Cars c
  join Fuelings f
    on f.CarId = c.CarId
  group by c.CarId,
           c.CarType
)
select cc.CarType,
       sum(cc.CarDistance) as TotalDistance,
       sum(cc.CarQuantity) as TotalQuantity,
       sum(cc.CarQuantity) * 100.0 / sum(cc.CarDistance) as TotalConsumption
from cte_car cc
group by cc.CarType;
结果

CarType TotalDistance TotalQuantity TotalConsumption
------- ------------- ------------- ----------------
Coupe            2010           463        23.034825
Hatchback        1980           451        22.777777
SUV              1600           301        18.8125

查看实际情况。

请确保您的问题是独立的。包含一把小提琴很好,但是你需要确保你的问题也包含了这个查询。而确切的问题是…?“一些算术和做一些计算”不是一个问题。很抱歉。我已经更新了请求和提琴。谢谢,桑德!这是我想要的。附加问题:如果我需要向查询中添加Maintenance表中的总和(与我的初始查询相同),如何继续?添加另一个cte,因为同时将
汽车
加油
Maintenance
连接会弄乱总和(在
加油
维护
之间没有1:1的关系)。快速加入维护成本。