Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Господа, ни как не могу справиться с запросом :(

16K
24 июля 2006 года
Dimasm
6 / / 29.04.2006
Есть три таблички
mens - список людей
charge - должны заплатить за услуги
payment - оплачивали за услуги
Код:
-----------------------
         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

допустим я хочу получить данные за весь 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

СУБД MySQL 5.0
у меня получилось такое через функцию (по сути подзапрос)
но вообще мне понядобятся, суммы, и когда я выполняю такой запрос для большого числа людей, то на его выполнение надо 5 мин на P4-2.8
Это должно делаться проще.
385
25 июля 2006 года
SomewherSomehow
477 / / 25.07.2004
Если тебе нужно именно в таком виде попробуй использовать union. Что-то вроде этого:
Код:
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
16K
25 июля 2006 года
Dimasm
6 / / 29.04.2006
так я уже пробовал, у меня в дальнейшем не получается группировать
эти цифры и выводить одной строкой.

Как сделать такое через JOIN?
385
26 июля 2006 года
SomewherSomehow
477 / / 25.07.2004
попробуй так:
Код:
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)


если я правильно тебя понял конечно
16K
26 июля 2006 года
Dimasm
6 / / 29.04.2006
УАУ! Респект! Работает
Код:
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)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог