SQL-запрос, чтобы узнать, сколько часов человек отработал за каждый год своей жизни

у меня две таблицы

Person(id, birthdate)

а также

Workday(personid, date, hours)

И birthdate, и date имеют формат ГГГГММДД и хранятся в виде строк.

Мне нужен запрос, который возвращает таблицу, содержащую возраст человека (0, 1, 2...) и количество часов, которые этот человек отработал в этом году жизни (год будет включать месяц дня рождения человека).

Это то, что у меня есть до сих пор:

SELECT CONVERT(INT, SUBSTRING(w.date, 0, 7)) - CONVERT(INT, SUBSTRING(p.birthdate, 0, 7)) AS age, w.hours AS totalhours
FROM Person AS p INNER JOIN Workday AS w ON p.id = w.personid
WHERE (p.person = @id)

Это возвращает

Таблица возврата запроса

Что мне нужно, так это для всех строк, где 0 ‹ age ‹ = 100, возраст должен быть равен 0, а общее количество часов в этих строках должно быть суммировано. Тогда для 100 ‹ возраст ‹= 200, возраст равен 1 и так далее...

Спасибо!


person player    schedule 28.01.2015    source источник
comment
Вы должны пометить свой вопрос с помощью базы данных, которую вы используете. И почему вы храните строки как даты?   -  person Gordon Linoff    schedule 28.01.2015
comment
попробуйте использовать CASE для установки возраста (0, 1 и т. д.), а затем используйте GROUP BY по возрасту, чтобы суммировать все часы   -  person demo    schedule 28.01.2015
comment
@Гордон. Сделанный. Мне нужно, чтобы дата была строкой для другого запроса, но если вы можете предоставить мне решение, где вам нужно, чтобы дата была другого типа, сделайте это! Спасибо.   -  person player    schedule 28.01.2015
comment
Не могли бы вы предоставить нам пример входных данных?   -  person Taras Velykyy    schedule 28.01.2015
comment
@tvelykyy. Человек: (1, 19890623), Рабочий день: (1, 19900412, 8)   -  person player    schedule 28.01.2015
comment
@player, это мало поможет. Будет намного проще, если вы подготовите образец sqlfiddle.com и покажете желаемый результат.   -  person Taras Velykyy    schedule 28.01.2015
comment
Мне нужно, чтобы дата была строкой для другого запроса. Тогда вам нужно сохранить ее в этой таблице как дату, а затем преобразовать ее в строку, необходимую для другого запроса. В указанном вами формате это будет CONVERT(CHAR, [date], 112)   -  person David Faber    schedule 28.01.2015


Ответы (2)


Запрос над вашим запросом:

  SELECT     ((age - 1)/100) as AgeRange, sum(totalhours)
  FROM         yourquery
  group by ((age -1)/100)
person Reza ArabQaeni    schedule 28.01.2015
comment
Отличный материал! Именно то, что я искал. - person player; 28.01.2015

Попробуйте - это даст людям возраст в годах, включая месяц рождения

SELECT w.personid, Datediff(MM, Convert(date, birthdate, 112), Convert(date, p.date, 112))/12 AS age, Sum(w.hours) AS totalhours
FROM Person AS p INNER JOIN Workday AS w ON p.id = w.personid
WHERE (p.person = @id)
Group By w.personid, Datediff(MM, Convert(date, birthdate, 112), Convert(date, p.date, 112))/12
Order By w.personid, Datediff(MM, Convert(date, birthdate, 112), Convert(date, p.date, 112))/12
person Ewan    schedule 28.01.2015