Запрос на объединение ?

Alesik
Дата: 10.11.2009 14:56:46
Помогите составить запрос на выборку, иначе сломаю свой мозг:

Таблица_1: код_отдела, наименование_отдела
Таблица_2: код_отдела, дата_рождения, оклад, образование, пол

Необходимо:
Наименование_отдела, кол-во мужчин, % мужчин до 30 лет, средний оклад мужчин, % мужчин с ВО, кол-во женщин, % женщин до 30 лет, средн. оклад женщин, % женщин с ВО

СПАСИБО ДАЖЕ ЗА ПОДСКАЗКУ
Alesik
Дата: 10.11.2009 15:06:55
Или хотя бы этот момент:

% мужчин до 30 лет
`
Дата: 10.11.2009 15:20:17
Alesik
Помогите составить запрос на выборку, иначе сломаю свой мозг:

Таблица_1: код_отдела, наименование_отдела
Таблица_2: код_отдела, дата_рождения, оклад, образование, пол

Необходимо:
Наименование_отдела, кол-во мужчин, % мужчин до 30 лет, средний оклад мужчин, % мужчин с ВО, кол-во женщин, % женщин до 30 лет, средн. оклад женщин, % женщин с ВО

СПАСИБО ДАЖЕ ЗА ПОДСКАЗКУ


если пол - логическое поле
SELECT t1.код_отдела, t1.наименование_отдела,
(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True),
(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True AND ((Year(Date()) - Year(t2.дата_рождения) < 30) OR (Year(Date()) - Year(t2.дата_рождения) = 30 AND DateSerial(Year(Date()), Month(t2.дата_рождения), Day(t2.дата_рождения)))))/(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True),
(SELECT AVG(оклад) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True),
(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True AND t2.образование='ВО')/(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True)
FROM Таблица_1 t1

для дамс - аналогично

зы
с этим - "% мужчин до 30 лет" - небольшая засада есть в виде 29 февраля - надо как-то обрабатывать
`
Дата: 10.11.2009 15:25:36
...немного не дописал
SELECT t1.код_отдела, t1.наименование_отдела,
(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True),
(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True AND ((Year(Date()) - Year(t2.дата_рождения) < 30) OR (Year(Date()) - Year(t2.дата_рождения) = 30 AND DateSerial(Year(Date()), Month(t2.дата_рождения), Day(t2.дата_рождения)) < Date())))/(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True),
(SELECT AVG(оклад) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True),
(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True AND t2.образование='ВО')/(SELECT COUNT(*) FROM Таблица_2 t2 WHERE t1.код_отдела=t2.код_отдела AND пол=True)
FROM Таблица_1 t1
T_Alex_G
Дата: 10.11.2009 15:30:57
Так вроде короче

SELECT Sum(IIf(q.Age>30,1,0))/Count(q.ФИО)*100
FROM (SELECT DateDiff("yyyy",[дата_рождения],Date()) AS Age, ФИО
FROM Таблица_2
WHERE пол=True
) as q

надо только справочник отделов привязать
T_Alex_G
Дата: 10.11.2009 15:32:08
упс - ДО 30 лет

SELECT Sum(IIf(q.Age<30,1,0))/Count(q.ФИО)*100
FROM (SELECT DateDiff("yyyy",[дата_рождения],Date()) AS Age, ФИО
FROM Таблица_2
WHERE пол=True
) as q
`
Дата: 10.11.2009 15:32:16
`
зы
с этим - "% мужчин до 30 лет" - небольшая засада есть в виде 29 февраля - надо как-то обрабатывать


наверно - самое "мудрое" будет - сделать свою функцию
`
Дата: 10.11.2009 15:34:57
T_Alex_G,

?DateDiff("yyyy",#12/31/2008#,#1/1/2009#)
 1 
?...?
Дата: 10.11.2009 15:55:05
`
`
зы
с этим - "% мужчин до 30 лет" - небольшая засада есть в виде 29 февраля - надо как-то обрабатывать


наверно - самое "мудрое" будет - сделать свою функцию

Посмотрите здесь. Оттуда можно выцепить и создать выражение для определения полных лет.
Alesik
Дата: 10.11.2009 16:01:30
Спасибо всем.