Господа, помогите наладить связи в запросе!!плз!!!

cyberpavel
Дата: 24.11.2009 18:41:13
Господа, подскажите пожалуйста!!!! Каким образом реализовать следующий запрос. Есть несколько табличек:

табл.1 "работники"
код/ФИО/дата рождения
1/Иванов/21.01.1981
2/Петров/21.01.1985
3/Ядров/21.01.1982

табл.2 Коды оплат
код/значение/
1 / повременная/
2 / сдельная/


табл. 3 "июль"
/код человека / код оплаты/ июль
1 1 100р.
2 1 200р

табл.4 "август"
/код человека / код оплаты/ август
1 1 300р.
1 2 / 400р
3 / 1 / 500р.


хочу на основе этих двух табличек получить такой, кажется, простой результат:

запрос1
код человека/код оплаты/ июль / август / ФИО / Дата рождения
1 1 100 300 /Иванов/ 21.01.1981
1 2 0 400 / Иванов/ 21.01.1981
2 1 200 0 /Петров/ 21.01.1985
3 1 0 500 /Ядров/21.01.1982

не понимаю какие типы связи выстраивать и вообще каким образом свзять таблицу 2, с таблицей 1 один к одному, так как inner join сделает только совпадающие, left - данные только из одной таблицы и совпадающие, right аналогично, а если связь не ставить, то будет декартово множество, которое ваще не нужно..


Где же выход? Буду безумно благодарен!
П-Л
Дата: 24.11.2009 19:05:24
Нефига было такие таблички плодить. Аффтору руки оторвать.
так можна
Дата: 24.11.2009 19:08:36
SELECT Работники.[Код работника], Nz(Июль.[Код оплаты], Август.[Код оплаты]) As [Код оплаты], Июль.Июль, Август.Август, Работники.ФИО, Работники.[Дата рождения]
FROM (Работники LEFT JOIN Июль ON (Работники.[Код работника] = Июль.[Код человека] AND Июль.[Код оплаты]="01") )
LEFT JOIN Август ON (Работники.[Код работника] = Август.[Код человека] AND Август.[Код оплаты]="01")
WHERE Nz(Июль.[Код оплаты], Август.[Код оплаты]) IS NOT NULL

UNION ALL

SELECT Работники.[Код работника],Nz(Июль.[Код оплаты], Август.[Код оплаты]), Июль.Июль, Август.Август, Работники.ФИО, Работники.[Дата рождения]
FROM (Работники LEFT JOIN Июль ON (Работники.[Код работника] = Июль.[Код человека] AND Июль.[Код оплаты]="02") )
LEFT JOIN Август ON (Работники.[Код работника] = Август.[Код человека] AND Август.[Код оплаты]="02")
WHERE Nz(Июль.[Код оплаты], Август.[Код оплаты]) IS NOT NULL

ORDER BY [Код работника], [Код оплаты]

зы
мнение предыдущего оратора - разделяю полностью
cyberpavel
Дата: 24.11.2009 19:13:24
П-Л
Нефига было такие таблички плодить. Аффтору руки оторвать.


Хм, я не автор табличек :) но соединить их надо именно мне... а какими, вы считаете, должны быть таблички в оптимальном варианте?
cyberpavel
Дата: 24.11.2009 19:18:19
так можна

SELECT....


А что есть "Nz" подскажите плз..
так,
Дата: 24.11.2009 19:21:03
cyberpavel
...
а какими, вы считаете, должны быть таблички в оптимальном варианте?


июль, август и остальные месяца - одна таблица
в итоге то что вам надо, - получается одним простым перекрестным запросом
отакота
Дата: 24.11.2009 19:21:39
select S.*, U.ФИО, U.[дата рождения] from (
select [код человека],[код оплаты], SUM(T.июль) as июль, SUM(T.август) as август from (
select [код человека],[код оплаты], июль, 0 as август from ИЮЛЬ union all
select [код человека],[код оплаты], 0 as июль, август from АВГУСТ) T
group by [код человека],[код оплаты]) S inner join работники U on S.[код человека]=U.код
так,
Дата: 24.11.2009 19:21:58
cyberpavel
так можна

SELECT....


А что есть "Nz" подскажите плз..


not zero
гм,
Дата: 24.11.2009 19:27:22
отакота
select S.*, U.ФИО, U.[дата рождения] from (
select [код человека],[код оплаты], SUM(T.июль) as июль, SUM(T.август) as август from (
select [код человека],[код оплаты], июль, 0 as август from ИЮЛЬ union all
select [код человека],[код оплаты], 0 as июль, август from АВГУСТ) T
group by [код человека],[код оплаты]) S inner join работники U on S.[код человека]=U.[Код работника]
cyberpavel
Дата: 24.11.2009 19:31:35
Всем гигантское спасибо, запрос пашет!!!! Сейчас будем разбираться!