Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 14:58   #1
Jrcfyf
Пользователь
 
Регистрация: 18.01.2012
Сообщений: 26
Вопрос Формирование подзапроса

В общем из базы дипломов необходимо выбрать те, у которых
дата записи не больше чем дата введённая пользователем, также чтоб эта же дата входила в промежуток между начальной датой актуальности и конечной датой актуальности, и диплом был максимального ранга на этот момент (баклавр, спец или ещё кто-то). Результатом запроса должен быть список id рабочих и их уровня образования на этот момент. Такие условия:
1) Datazapis<@ActualData(параметр передаваемый пользователем)
2) DateAct < @ActualData и ISNULL(KonDate,0)>@ActualData
3) max(idObrazov).
Может быть такое, что под второе условие попадёт 2 диплома.
Мой запрос выглядит так:
Код:
select [IDWORKER], [idObrazov] FROM [dbo].[DIPLOM]
INNER JOIN (SELECT IDSECDIP FROM DIPLOM 
            WHERE (DATAZAPIS < '20111201' AND 
            (max(DATEACT)<'20111201' AND 
             ISNULL(KONDATE,0)>'20111201')) 
group by IDSECDIP) mx
ON mx.IDSECDIP=diplom.IDSECDIP                
GROUP BY idworker,idObrazov
Выдаёт такую ошибку:
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.
Что с этим можно сделать?Помогите, плз!
Jrcfyf вне форума Ответить с цитированием
Старый 06.02.2012, 15:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT D1.IDWORKER,D1.idObrazov
  FROM DIPLOM D1,
    (SELECT D2.IDWORKER,MAX(D2.idObrazov) AS idObrazov
       FROM DIPLOM D2
       WHERE D2.DATAZAPIS<='20111201' AND
             '20111201' BETWEEN D2.DATEACT AND ISNULL(D2.KONDATE,'20111201')
       GROUP BY D2.IDWORKER) D3
  FROM D1.IDWORKER=D3.IDWORKER AND D1.idObrazov=D3.idObrazov
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.02.2012, 16:43   #3
Jrcfyf
Пользователь
 
Регистрация: 18.01.2012
Сообщений: 26
По умолчанию

Спасибо за подсказку, ваш этот код немного надо было модифицировать, так как он не работает
Код:
SELECT D1.IDWORKER,D1.idObrazov
  FROM DIPLOM D1 INNER JOIN
    (SELECT D2.IDWORKER,MAX(D2.idObrazov) AS idObrazov
       FROM DIPLOM D2
       WHERE D2.DATAZAPIS<='20111201' AND
             '20111201' BETWEEN D2.DATEACT AND ISNULL(D2.KONDATE,'20111201')
       GROUP BY D2.IDWORKER) D3
  ON D1.IDWORKER=D3.IDWORKER AND D1.idObrazov=D3.idObrazov
Однако я решила проблему немного иначе:
Код:
select [IDWORKER], [idObrazov] FROM [dbo].[DIPLOM]
WHERE (DATAZAPIS < '20111201' AND (KONDATE>'20111201' OR KONDATE is null))
GROUP BY idworker,idObrazov
HAVING (max(DATEACT)<'20111201')
Jrcfyf вне форума Ответить с цитированием
Старый 06.02.2012, 16:51   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. FROM Table1,Table2 WHERE <условие> и FROM Table1 INNER JOIN Table 2 ON <условие> это одно и тоже по результату, не понял почему не работал мой вариант
2. Ваш последний вариант вернет не то, что вам нужно - не вижу MAX(idObrazov)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формирование отчета Jenikj Microsoft Office Access 2 15.04.2011 13:15
Взятие названий объектов из подзапроса euronymous SQL, базы данных 4 01.03.2010 06:34
ФОРМИРОВАНИЕ отчетов Anna_fors Помощь студентам 16 26.02.2010 09:32
Как выполнить два подзапроса SQL Caster SQL, базы данных 3 06.12.2009 11:21
Формирование списков BrenD Microsoft Office Excel 1 06.04.2009 08:28