Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите составить запрос? мой работает не совсем как хочется  (Прочитано 10044 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Sommer
Молодой специалист

us
Offline Offline

« : 03-03-2009 12:59 » 

есть таблица CONSULTER для хранения информации от сотрудниках, в которой есть поля CONS_USER(имя сокр.) и CONS_ID
есть таблица JOB_SCHEDULE для хранения информации о рабочих сменах, в которой есть поля CONS_ID и JOB_DATE(дата рабочей смены)
есть таблица ORDERS для хранения заказанных работ, в которой есть поля ORDER_ID(номер заказа), ORDER_CONSULTER(id сотрудника), ORDER_PREPAID(предоплата), ORDER_RESTPAID(доплата)

надо сде5лать отчет, со следующими данными за период(месяц)
| консультанты|рабочие смены |кол-во заказов |общая сумма заказов |
| Иванов | 13 | 25 | 125 000 |
| Сусанин | 0 | 0 | 0 |


Код:
SELECT ORDERS.ORDER_CONSULTER, CONSULTER.CONS_USER, 
SUM(ORDER_PREPAID) AS SUM_ORDER_PREPAYMENT,
SUM(ORDER_PREPAID+ORDER_RESTPAID) AS SUM_ORDER_PAYMENT,
COUNT(DISTINCT JOB_SCHEDULE.JOB_DATE) AS SUM_DAYS,
COUNT(DISTINCT ORDERS.ORDER_ID) AS SUM_ORDERS
FROM
CONSULTER, ORDERS, JOB_SCHEDULE
WHERE
ORDERS.ORDER_DELETED=FALSE AND ORDERS.ORDER_CONSULTER=CONSULTER.CONS_ID AND JOB_SCHEDULE.CONS_ID=ORDERS.ORDER_CONSULTER
GROUP BY
ORDERS.ORDER_CONSULTER,CONSULTER.CONS_USER,JOB_SCHEDULE.CONS_ID
AND some_date between DATE 'date1' and DATE 'date2';

мой запрос выводит только одну строчку и похоже только того у кого были заказы за период и рабочие смены. помогите вывести в отчет всех сотрудников?
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-03-2009 13:18 » 

left join
right join
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sommer
Молодой специалист

us
Offline Offline

« Ответ #2 : 03-03-2009 13:24 » 

угу, читал, но не смог сделать..
если у кого-то будет свободное время поправить мой запрос - буду очень рад )
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 03-03-2009 13:35 » 

Sommer, покажи что делал
как применял left join
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #4 : 03-03-2009 16:37 » 

Под oracle Ага вроде так:
Код:
SELECT ORDERS.ORDER_CONSULTER, CONSULTER.CONS_USER, 
SUM(ORDER_PREPAID) AS SUM_ORDER_PREPAYMENT,
SUM(ORDER_PREPAID+ORDER_RESTPAID) AS SUM_ORDER_PAYMENT,
COUNT(DISTINCT JOB_SCHEDULE.JOB_DATE) AS SUM_DAYS,
COUNT(DISTINCT ORDERS.ORDER_ID) AS SUM_ORDERS
FROM
CONSULTER, ORDERS, JOB_SCHEDULE
WHERE
ORDERS.ORDER_DELETED=FALSE AND ORDERS.ORDER_CONSULTER(+)=CONSULTER.CONS_ID AND JOB_SCHEDULE.CONS_ID(+)=ORDERS.ORDER_CONSULTER
GROUP BY
ORDERS.ORDER_CONSULTER,CONSULTER.CONS_USER,JOB_SCHEDULE.CONS_ID
AND some_date between DATE 'date1' and DATE 'date2';
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 03-03-2009 21:11 » 

PooH, оракловые штучки все-таки не совсем совместимы - лучше LEFT JOIN использовать. Кроме того, "ORDER_DELETED = FALSE" удалит все строки с ORDER_DELETED IS NULL, если оставить это в WHERE.

Алиасы тоже не помешают для читаемости.

Код: (SQL)
SELECT o.ORDER_CONSULTER, c.CONS_USER,
    SUM(o.ORDER_PREPAID) AS SUM_ORDER_PREPAYMENT,
    SUM(o.ORDER_PREPAID + o.ORDER_RESTPAID) AS SUM_ORDER_PAYMENT,
    COUNT(DISTINCT js.JOB_DATE) AS SUM_DAYS,
    COUNT(DISTINCT o.ORDER_ID) AS SUM_ORDERS
FROM CONSULTER c
    LEFT JOIN ORDERS o ON (o.ORDER_CONSULTER = c.CONS_ID AND o.ORDER_DELETED = FALSE)
    LEFT JOIN JOB_SCHEDULE js ON (js.CONS_ID = o.ORDER_CONSULTER)
WHERE some_date BETWEEN DATE 'date1' AND DATE 'date2';
GROUP BY o.ORDER_CONSULTER, c.CONS_USER, js.CONS_ID

IMHO, запрос составлен некорректно: в данном случае выборку нужно делать по CONSULTER, а другие две таблицы подтягиваются к ней.
« Последнее редактирование: 03-03-2009 21:17 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #6 : 04-03-2009 05:53 » 

RXL, я специально привел оракловые джоины Ага
Записан

Удачного всем кодинга! -=x[PooH]x=-
Sommer
Молодой специалист

us
Offline Offline

« Ответ #7 : 08-03-2009 18:52 » new

спасибо за помощь, ребят.
код, предложенный RXL работает,  я лишь внес условия по датам под правую часть LEFT JOIN ON; предложенный вариант, как есть, не работает. собственно, когда я пытался сам - делал также, полагаю в этом была проблема.
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
Sommer
Молодой специалист

us
Offline Offline

« Ответ #8 : 08-03-2009 18:58 » 

предложенный вариант, как есть, не работает.
уточню лишь что не работает в в моем контексте.
благодарен
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 09-03-2009 10:42 » 

Sommer, о чем я и говорил: запрос некорректен. Сперва должна быть выборка по основной таблице, а потом должны подтягиваться LEFT JOIN-ы, но не иначе. Вполне логично, что CONSULTER - типичный справочник и some_date там не пахнет. Быстрее всего, some_date относится к JOB_SCHEDULE. След., в WHERE размещать это нельзя.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines