【问题标题】:SUM multiple tables GROUP BY columnSUM 多个表 GROUP BY 列
【发布时间】:2021-05-01 18:19:03
【问题描述】:

我有以下 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
  • 消费:18,8125

请看这里:http://sqlfiddle.com/#!18/2636c/18

【问题讨论】:

  • 请确保您的问题是独立的。包含一个小提琴很棒,但您需要确保您的问题也包含查询。
  • 而确切的问题是......?
  • “一些总和做一些计算”不是问题。
  • 对不起。我已经更新了请求和小提琴。

标签: sql sql-server group-by sum


【解决方案1】:

我使用公用表表达式cte_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

Fiddle 了解实际情况。

【讨论】:

  • 谢谢,桑德!这就是我想要的。附加问题:如果我需要像在初始查询中一样将维护表中的 SUM 添加到查询中,该怎么办?
  • 添加另一个 cte 因为同时加入 CarsFuelingsMaintenances 会弄乱总和(Fuelings 和 @987654332 之间没有一对一的关系@)。快速fiddle update 包括维护费用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多