2014-10-21 134 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