-----------------------
MENS
-----------------------
score_num | men_name
-----------------------
1 | Иванов А.А.
2 | Петров И.В.
----------------------------------------------
CHRAGE
----------------------------------------------
id | score_num | tr_month | tr_year | tr_value
----------------------------------------------
234 1 1 2006 20.0
235 1 2 2006 20.0
236 1 3 2006 18.0
237 1 4 2006 21.0
tr_month, tr_year - за какой месяц какого года
ему это начислили за услугу
tr_value - сколько ему начислили
-------------------------------------
PAYMENT
-------------------------------------
id | score_num | tr_date | tr_value
-------------------------------------
234 1 14.01.2006 20.0
234 1 17.02.2006 22.0
234 1 20.04.2006 23.0
Господа, ни как не могу справиться с запросом :(
mens - список людей
charge - должны заплатить за услуги
payment - оплачивали за услуги
Код:
допустим я хочу получить данные за весь 2006 год
charge.tr_year = 2006
Year(payment.tr_date) = 2006
можно ли одним запросом получить следующую строку
Код:
score_num | men_name | charge | payment
------------------------------------------
1 Иванов А.А. 20.0
1 Иванов А.А. 20.0
1 Иванов А.А. 18.0
1 Иванов А.А. 21.0
1 Иванов А.А. 20.0
1 Иванов А.А. 22.0
1 Иванов А.А. 23.0
------------------------------------------
1 Иванов А.А. 20.0
1 Иванов А.А. 20.0
1 Иванов А.А. 18.0
1 Иванов А.А. 21.0
1 Иванов А.А. 20.0
1 Иванов А.А. 22.0
1 Иванов А.А. 23.0
СУБД MySQL 5.0
у меня получилось такое через функцию (по сути подзапрос)
но вообще мне понядобятся, суммы, и когда я выполняю такой запрос для большого числа людей, то на его выполнение надо 5 мин на P4-2.8
Это должно делаться проще.
Код:
select
men_name,
charge = tr_value,
payment = NULL
from
MENS m,
CHRAGE c
where
m.score_num = c.score_num
union all
select
men_name,
charge = NULL,
payment = tr_value
from
MENS m,
PAYMENT p
where
m.score_num = p.score_num
men_name,
charge = tr_value,
payment = NULL
from
MENS m,
CHRAGE c
where
m.score_num = c.score_num
union all
select
men_name,
charge = NULL,
payment = tr_value
from
MENS m,
PAYMENT p
where
m.score_num = p.score_num
эти цифры и выводить одной строкой.
Как сделать такое через JOIN?
Код:
select
m.men_name,
b.charge,
a.payment
from
MENS m
left outer join
(
select
charge = sum(tr_value),
c.score_num
from
CHRAGE c
group by c.score_num
) b on (b.score_num = m.score_num)
left outer join
(
select
payment = sum(tr_value),
p.score_num
from
PAYMENT p
group by p.score_num
) a (on a.score_num = m.score_num)
m.men_name,
b.charge,
a.payment
from
MENS m
left outer join
(
select
charge = sum(tr_value),
c.score_num
from
CHRAGE c
group by c.score_num
) b on (b.score_num = m.score_num)
left outer join
(
select
payment = sum(tr_value),
p.score_num
from
PAYMENT p
group by p.score_num
) a (on a.score_num = m.score_num)
если я правильно тебя понял конечно
Код:
SELECT
m.score_num,
a.charge,
b.payment
FROM
mens AS m
left outer join
(
select
sum(c.tr_value) AS charge ,
c.score_num
from
transact_charge c
group by c.score_num
)AS A on (A.score_num = m.score_num)
left outer join
(
select
sum(p.tr_value) AS payment,
p.score_num
from
transact_payment p
group by p.score_num
)AS B on( B.score_num = m.score_num)
m.score_num,
a.charge,
b.payment
FROM
mens AS m
left outer join
(
select
sum(c.tr_value) AS charge ,
c.score_num
from
transact_charge c
group by c.score_num
)AS A on (A.score_num = m.score_num)
left outer join
(
select
sum(p.tr_value) AS payment,
p.score_num
from
transact_payment p
group by p.score_num
)AS B on( B.score_num = m.score_num)