2014-10-21 5 views
1

У меня есть две таблицы в моей datebase:Объединение двух SQL таблиц и группировка

Автомобили: IdCar PK, Company, Тип, Цвет

Аренда: 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

Я пытался группа Компании в конце запроса, но она возвращается ошибка:

Столбец «Renting.Id-rent_date» недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

ответ

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

Я не предполагал, что запрос будет настолько сложным! Он отлично работает, спасибо! –

+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

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

Отлично, это было то, что я пропустил, спасибо! Теперь у меня есть дни аренды каждого автомобиля компании, как я могу разделить его на годы? Будет ли там какой-то выбор внутри другого выбора или что-то в этом роде? –

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 Renting WHERE YEAR (Id-rent_date)! = YEAR (Car_return_date), чтобы проверить, сколько данных связано с этой проблемой. –

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 
Смежные вопросы