Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/222: Рейтинг темы: голосов - 222, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 8
1

Запрос: вычислить средний возраст

22.01.2016, 02:00. Показов 43172. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Есть таблица на Microsoft SQL Server, в которой Имя, Фамилия и дата рождения, не могу создать запрос, что бы отобразить людей, которым меньше 30 лет, а так же нужно вычислить средний возраст. Помогите пожалуйста.
T-SQL
1
2
3
SELECT FirstName, LastName FROM dbo.sotr
WHERE DATEDIFF (yyyy, BirthDate, Getdate()) > 30
ORDER BY LastName
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2016, 02:00
Ответы с готовыми решениями:

Выбрать средний возраст employee из городов
вот что написал, select City, avg(FLOOR(DATEDIFF(day, BirthDate, GETDATE()) / 365.25)) as...

Как вычислить возраст студента?
При помощи DATEDIFF

Вложенный запрос: информация о студентах и дисциплинах, в которых средний балл выше среднего и меньше максимального
Мне дали задание сделать запрос-вывести информацию о студентах и дисциплинах в которых средний балл...

Определить средний возраст и вывести порядковые номера членов бригады, возраст которых превышает средний
Имеется список 12 членов бригады с указанием их возраста. Определить средний возраст и вывести...

13
268 / 96 / 75
Регистрация: 04.12.2015
Сообщений: 369
Записей в блоге: 1
22.01.2016, 07:20 2
Ваш исходный запрос почти верный, я только знак поменял

T-SQL
1
2
3
SELECT *, GETDATE(),DATEDIFF("YYYY", BirthDate , GETDATE())
FROM sotr
WHERE DATEDIFF("YYYY", BirthDate , GETDATE()) < 30
Запрос для определения среднего возраста:
T-SQL
1
2
3
SELECT AVG(DATEDIFF("YYYY", BirthDate , GETDATE()))
FROM sotr
WHERE DATEDIFF("YYYY", BirthDate , GETDATE()) < 30
Проверял на 2008 сервере.
1
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 8
22.01.2016, 08:59  [ТС] 3
Спасибо огромное! А можно ли еще сделать, что бы выводило возраст сотрудников?
0
268 / 96 / 75
Регистрация: 04.12.2015
Сообщений: 369
Записей в блоге: 1
22.01.2016, 09:07 4
Так уже выводится (через * в первом запросе).

"SELECT * FROM ..." - это вывести всё из ... (в т.ч. значения поля BirthDate, содержащего дату рождения)
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 8
22.01.2016, 09:12  [ТС] 5
Точно, все есть. Не заметил, сори. Еще раз спасибо
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 8
23.01.2016, 20:02  [ТС] 6
Еще вопросик, есть база, в одной таблице имена и фамилии, в другой заказы, я их объеденил с помощью JOIN как теперь посчтитать кол-во заказов каждого человека в 1997 году? Не понимаю как использовать COUNT. Заранее спасибо!
T-SQL
1
2
3
4
5
6
7
SELECT dbo.Employees.FirstName, dbo.Employees.LastName
    FROM dbo.Employees LEFT JOIN dbo.Orders ON
    DATEPART (yyyy, OrderDate)=1997
    UNION
    SELECT dbo.Employees.FirstName, dbo.Employees.LastName
    FROM dbo.Employees LEFT JOIN dbo.Orders ON
    DATEPART (yyyy, OrderDate)=1997
0
268 / 96 / 75
Регистрация: 04.12.2015
Сообщений: 369
Записей в блоге: 1
23.01.2016, 20:46 7
Не проверял запрос, но вроде должен работать.
COUNT совместно с GROUP BY возвращает количество записей в группе

SQL
1
2
3
SELECT dbo.Employees.FirstName, dbo.Employees.LastName, COUNT(dbo.Employees.LastName) AS Cnt1
FROM dbo.Employees LEFT JOIN dbo.Orders ON DATEPART (yyyy, OrderDate)=1997
GROUP BY dbo.Employees.FirstName, dbo.Employees.LastName
Только у Вас таблицы не правильно объединены. Условие, которое сейчас участвует в объединении нужно поместить в WHERE, а объединять по идентификаторам клиентов (тех, что делают заказы).
0
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 8
23.01.2016, 20:51  [ТС] 8
Ошибку выбивает
Сообщение 208, уровень 16, состояние 1, строка 1
Invalid object name 'dbo.Employees'.

А как правильно объединить подскажите пожалуйста. Целый день с этим JOINом мучаюсь
0
268 / 96 / 75
Регистрация: 04.12.2015
Сообщений: 369
Записей в блоге: 1
23.01.2016, 21:06 9
Лучший ответ Сообщение было отмечено serjik85 как решение

Решение

Странно, у меня подобный запрос работает. Замените "COUNT(dbo.Employees.LastName) AS Cnt1" на "COUNT(*) AS Cnt1"

Что касается JOIN:

SQL
1
2
3
4
SELECT dbo.Employees.FirstName, dbo.Employees.LastName, COUNT(dbo.Employees.LastName) AS Cnt1
FROM dbo.Employees LEFT JOIN dbo.Orders ON dbo.Employees.EmployeeID = dbo.Orders.EmployeeID  
WHERE DATEPART (yyyy, dbo.Orders.OrderDate)=1997
GROUP BY dbo.Employees.FirstName, dbo.Employees.LastName
Поле EmployeeID - идентификатор клиента (как это поле в ваших таблицах называется я к сожалению не знаю). Также оно может называться по своему в каждой из таблиц.
1
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 8
23.01.2016, 21:15  [ТС] 10
Спасибо, заработало, а чем отличается LEFT JOIN от RIGHT JOIN?
0
268 / 96 / 75
Регистрация: 04.12.2015
Сообщений: 369
Записей в блоге: 1
24.01.2016, 05:43 11
Это почти одно и тоже.
Допустим есть 2 таблицы: А и Б. Нужно объединить их строки по какому-то признаку (или по признакам). LEFT JOIN для каждой строки таблицы А ищет соответствия в таблице Б и производит объединение. RIGHT JOIN для каждой строки таблицы B ищет соответствия в таблице А и производит объединение. Т.е. замена LEFT JOIN на RIGHT JOIN с точки зрения конечного результата эквивалентна изменения порядка упоминания таблиц в запросе:

SQL
1
2
SELECT список полей
FROM A LEFT JOIN B ON условие объединения
вернёт тот же набор записей, что и

SQL
1
2
SELECT список полей
FROM B RIGHT JOIN A ON условие объединения
1
0 / 0 / 0
Регистрация: 22.01.2016
Сообщений: 8
24.01.2016, 15:05  [ТС] 12
Спасибо большое, разобрался
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,270
24.01.2016, 15:56 13
Цитата Сообщение от YakobsEA Посмотреть сообщение
T-SQL
1
WHERE DATEPART (yyyy, dbo.Orders.OrderDate)=1997
Ну и ну!
Столько глупостей в таком коротком фрагменте!
1. Ограничения, накладываемые на правую таблицу LEFT JOINа в WHERE, почти всегда превращает его в INNER JOIN.
2. Ограничения, накладываемые на функцию от поля, а не на само поле, не дают возможности оптимизатору использовать индекс, если он есть.

Самое главное - нигде не показано правильного вычисления возраста человека.
Так что непонятно, как же предлагается вычислить среднее от него.
Связь таблиц должна быть такая, если нужен именно LEFT JOIN:
T-SQL
1
2
3
4
5
FROM dbo.Employees E
LEFT JOIN dbo.Orders O
  ON E.EmployeeID=O.EmployeeID
 AND O.OrderDate>='1997'
 AND O.OrderDate<'1998'
0
268 / 96 / 75
Регистрация: 04.12.2015
Сообщений: 369
Записей в блоге: 1
24.01.2016, 20:04 14
Да, представленный запрос оптимальнее. Я как-то об оптимизации не задумывался, каюсь.
В последних запросах о среднем возрасте речи не идёт, но там где идёт условие не вполне корректно сформировано из-за большой погрешности. Например, DATEDIFF("YYYY", '2015-12-31', '2016-01-01') вернёт 1, хотя годом там и не пахнет . С учётом замечаний по оптимальности кода более правильный запрос для расчёта среднего значения ПОЛНЫХ лет такой:
T-SQL
1
2
3
SELECT AVG(DATEDIFF("MM", BirthDate , GETDATE())/12)
FROM sotr
WHERE BirthDate > DATEADD ("YY", -30, GETDATE())
0
24.01.2016, 20:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2016, 20:04
Помогаю со студенческими работами здесь

Запрос. Средний возраст по каждому из пунктов
Нужно вычислить средний возраст водителя по каждой из встречающихся марок автомобиля. 2 таблицы...

Вычислить средний возраст членов группы
В туристической группе 15 человек разного возраста. Вычислить средний возраст членов группы.

Выясните средний возраст группы и процент людей, возраст которых < 20 лет
1. Известен возраст группы людей, состоящей из n человек. Выясните средний возраст группы и...

Выясните средний возраст группы и процент людей, возраст которых меньше 20 лет
Помогите пожалуйста написать эту программу. Буду очень благодарен, заранее спасибо. всем добра....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru