2014-10-21 90 views
1

我在DATEBASE两个表:连接两个SQL表和分组

汽车: IdCar PK, 公司, 类型, 颜色

租赁: 的Id-rent_date PK, IdCar FK , Car_return_date

我需要编写一个查询,将返回三列: - 年 - 天量,其中具体的补偿的汽车任何被租住在今年 - 公司 - 从汽车表

现在我有:

SELECT DATEDIFF(dd, Id-rent_date, Car_return_date) AS Days, Company FROM Renting INNER JOIN Cars ON Renting.IdCar = Cars.IdCar

我试着组通过公司查询的结束,但它返回一个错误:

因为它不是在聚合函数或GROUP BY子句中包含

列“Renting.Id-rent_date”在选择列表中无效。

回答

0

完整的查询:

declare @iter int 
     declare @max int 
     declare @test Table ([Id-rent_date] datetime, Car_return_date datetime, IdCar int) 
     set @iter = 0 
     select @max = max(year(Car_return_date) - year([Id-rent_date])) FROM Renting 

       WHILE(@iter < @max) 
       BEGIN 
      insert into @test 
        SELECT 
      DATEADD(yy, DATEDIFF(yy,0,[Id-rent_date]) + @iter, 0) 
      ,DATEADD(yy, DATEDIFF(yy,0,[Id-rent_date]) + 1 + @iter, -1) 
      ,IdCar 
      FROM Renting 
      where year([Id-rent_date]) + @iter <> year(Car_return_date) and year([Id-rent_date]) <> year(Car_return_date) 
      set @iter = @iter + 1 
       END 
SELECT YEAR([Id-rent_date]), SUM(DATEDIFF(dd, [Id-rent_date], Car_return_date)) AS Days, 
      Company 
FROM 

        (SELECT 
      [Id-rent_date] 
      ,[Car_return_date] 
      ,IdCar 
      FROM Renting 
      where year([Id-rent_date]) = year(Car_return_date) 
      union all 
       SELECT 
      [Id-rent_date] 
      ,DATEADD(yy, DATEDIFF(yy,0,[Id-rent_date]) + 1, -1) 
      ,IdCar 
      FROM Renting 
      where year([Id-rent_date]) <> year(Car_return_date) 
      UNION ALL 
      SELECT 
      DATEADD(yy, DATEDIFF(yy,0,[Car_return_date]), 0) 
      ,[Car_return_date] 
      ,IdCar 
      FROM Renting 
      where year([Id-rent_date]) <> year(Car_return_date) 
       UNION ALL 
     select * from @test) RentingSplit inner join Cars ON RentingSplit.IdCar = Cars.IdCar 
GROUP BY Company, YEAR([Id-rent_date]) 
+0

我没想到那个查询会如此复杂!它工作得很好,谢谢! – 2014-10-22 17:29:41

+0

如果你在现场Car_return_date以NULL值允许(车上没有得到回报),你应该使用ISNULL(Car_return_date,GETDATE()),而不是Car_return_date。 它应该看起来像SUM(DATEDIFF(DD,[ID-rent_date],ISNULL(Car_return_date,GETDATE()))) – steryd 2014-10-22 17:52:59

1

如果添加了group by条款,在选择列表中的所有项目必须是你已经通过或聚合计算分组列。在这里,例如,你要总结每个日公司有量:

SELECT  SUM(DATEDIFF(dd, Id-rent_date, Car_return_date)) AS Days, 
      Company 
FROM  Renting 
INNER JOIN Cars ON Renting.IdCar = Cars.IdCar 
GROUP BY Company 
+0

大,这件事,我错过了,谢谢!现在我有租用每辆公司车的日子,我怎么能把它分成几年?会在那里需要一些选择内部另一个选择或类似的东西? – 2014-10-21 21:55:44

1

这是不容易的,因为你必须考虑在哪一年的Id-rent_date从Car_return_date不同的情况。 如果您认为YEAR([ID-rent_date)= YEAR(Car_return_date)是

SELECT YEAR([Id-rent_date]), SUM(DATEDIFF(dd, [Id-rent_date], Car_return_date)) AS Days, 
      Company 
FROM  Renting 
INNER JOIN Cars ON Renting.IdCar = Cars.IdCar 
GROUP BY Company, YEAR([Id-rent_date]) 
+0

是的,这是一个问题,我正在考虑这种情况下,我执行查询:SELECT * FROM租赁WHERE YEAR(ID-rent_date)= YEAR(Car_return_date)来测试有多少数据是有关这个问题! – 2014-10-21 23:06:06

0

您需要更改列名ID-rent_date到id_rent_date因为 - 是保留字符,然后:

SELECT DATEDIFF(dd, Id_rent_date, Car_return_date) 
AS Days, 
DATEPART(yy, Car_return_date) 
AS year, Company 
FROM Renting 
INNER JOIN Cars 
ON Renting.IdCar = Cars.IdCar 
GROUP BY Company