Опять SQL...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Опять SQL...

Сообщение Rojohn » 14.01.2006 (Сб) 16:56

Есть запрос:
Код: Выделить всё
SELECT Max(SumRN.RN) AS MaxRN, SumRN.Tit
FROM [SELECT Count(ADDRESS.REGION_DEPT) AS RN, ADDRESS.REGION_DEPT as Tit
FROM ADDRESS
WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1))
GROUP BY ADDRESS.REGION_DEPT]. AS SumRN;


Если убрать SumRN.Tit из первой строчки, то он работает и показывает тока число. Как правильно показать текст, соответствующий этому числу из ADDRESS.REGION_DEPT?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.01.2006 (Сб) 17:14

Во-первых, почему не в разделе Базы данных, а во-вторых, что за база...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 14.01.2006 (Сб) 17:22

1) По-привычке :)
2) БД Access 2000

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.01.2006 (Сб) 17:48

Не знаю как там в access с такими вложенными запросами, но попробуй во вложенном запросе ADDRESS.REGION_DEPT as Tit заменить на First(ADDRESS.REGION_DEPT) as Tit.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 14.01.2006 (Сб) 18:00

Нет... это не работает. Ошибка та же: "Попытка выполнить запрос, который не включает указанное выражение 'tit' как часть статистической функции или группы". Просто мне нужно выдать значение второго поля, соответствующего первому, по которому были выполнены агрегатные функции. Короче надо включить поле ADDRESS.REGION_DEPT в агрегатную функцию MAX или что-то похожее...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.01.2006 (Сб) 18:05

И внутри поставь First(ADDRESS.REGION_DEPT) as Tit, и снаружи First(SumRN.Tit).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 14.01.2006 (Сб) 18:16

Спасибо Шаман за ответы, но что-то не идёт с First... Может я не так пишу. Я так понял, что должно было получиться что-то подобное тому, что предложил Алибек. Но всё равно спасибо!

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 18.01.2006 (Ср) 4:47

SELECT TOP 1 Count(ADDRESS.REGION_DEPT) AS RN, ADDRESS.REGION_DEPT as Tit
FROM ADDRESS
WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1))
GROUP BY ADDRESS.REGION_DEPT
ORDER BY Count(ADDRESS.REGION_DEPT) DESC

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 18.01.2006 (Ср) 5:13

PS Прошу прощения но это не совсем верно с точки зрения статистики.
А если MAX Количество совпадает у нескольких строк?

Проще объяснить на нескольких запросах, а не на вложенных (тем более в Access вовсе не обязательно городить вложенные запросы , скорость обработки не увеличится, а сложность написания катастрофически возрастет).

1. Подсчитываем количество (1 запрос)
2. Определяем Max (2 запрос)
3. Связываем по Max(2 запрос) c количеством(1 запрос) и выдаем строку У кого это число (3 запрос).

1. SELECT Count(ADDRESS.REGION_DEPT) AS RN, ADDRESS.REGION_DEPT as Tit
FROM ADDRESS
WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1))
GROUP BY ADDRESS.REGION_DEPT Пусть ccc1

2.SELECT Max(RN) AS MRN FROM ccc1 Пусть mmm1
Их необходимо добавить в QueryDefs

3.SELECT Tit, MRN FROM mmm1 inner join ccc1 on mmm1.MRN=ccc1.RN
Тогда мы уже увидим все строки с Max числом.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 18.01.2006 (Ср) 19:43

blinow
Во первых тема перешла в раздел "Базы данных", а во вторых мне нужен именно вложенный запрос, т.к. Access вызывается из процедуры VB60.
Спасибо за ответы, но я уже выбрал вариант для своей программы...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 167

    TopList