MSAccess - Запрос SQL...

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

MSAccess - Запрос SQL...

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

Есть запрос:
Код: Выделить всё
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?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.01.2006 (Сб) 17:55

Честно говоря, не понял логики, почему запрос так странно построен. Кроме того, вложенные запросы вроде бы ограничиваются круглыми скобками, а не квадратными.
Запрос у тебя не работает, потому что в одной строке используются и агрегатные функции, и значение полей.
Скажи, что тебе надо, словами.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.01.2006 (Сб) 17:57

Я бы написал так (если я правильно понял, что требуется):
Код: Выделить всё
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 1 DESC
Lasciate ogni speranza, voi ch'entrate.

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

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

Надо найти максимальное из количеств повторений наименований поля ADDRESS.REGION_DEPT. То есть для поля с наименованиями:
1) Определить количество повторений каждого из различных наименований;
2) Определить наименование, у которого самое большое количество повторений;
3) Выдать количество повторений и само наименование, соответствующее п.2
Последний раз редактировалось Rojohn 14.01.2006 (Сб) 18:23, всего редактировалось 2 раз(а).

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

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

В принципе и такой вариант подойдет (спасибо Алибеку), но а мой вариант нельзя подправить? Мне для дальнейшего пригодилось бы... Или он правда стрёмный?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.01.2006 (Сб) 18:31

Твой вариант логически неверен.
С него можно наверное что-то получить, если ты объяснишь, что тебе надо.
Lasciate ogni speranza, voi ch'entrate.

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

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

Ладно... пока ничего кроме написанного. Спасибо за этот вариант!

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

И всё же надо включить ещё одно поле, как?

Сообщение Rojohn » 16.01.2006 (Пн) 12:05

И всё же надо включить ещё одно поле, как?
Надо что-то типа:
Код: Выделить всё
SELECT TOP 1 Count(ADDRESS.REGION_DEPT) AS RN, ADDRESS.REGION_DEPT AS Tit,ADDRESS.REGION_CODE As RC From Address WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1)) GROUP BY ADDRESS.REGION_DEPT ORDER BY 1 DESC;


Это конечно не работает... как правильно надо?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.01.2006 (Пн) 12:10

Словами скажи, что тебе нужно.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.01.2006 (Пн) 12:23

может так :?:

Код: Выделить всё
SELECT TOP 1
   Count(ADDRESS.REGION_DEPT) AS RN,
   First(ADDRESS.REGION_DEPT) AS Tit,
   First(ADDRESS.REGION_CODE) As RC
From Address
WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1))
GROUP BY ADDRESS.REGION_DEPT
ORDER BY 1 DESC

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

Сообщение Rojohn » 16.01.2006 (Пн) 12:23

Нужно в том запросе, что и был добавить для вывода ещё одно поле из той же таблицы, соответствующее выбранному максимуму...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.01.2006 (Пн) 12:26

ну так и добавь через
Код: Выделить всё
First(ЕщеОдноПоле) as ЕщеОдноПоле

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

Сообщение Rojohn » 16.01.2006 (Пн) 12:30

Konst_One
В принципе вроде работает, но будет ли это верным, т.к. в
First(ADDRESS.REGION_DEPT) AS Tit,
First(ADDRESS.REGION_CODE) As RC
берётся первое значение, но я не знаю совпадает ли оно с выбранным в Count(ADDRESS.REGION_DEPT) AS RN и GROUP BY ADDRESS.REGION_DEPT
ORDER BY 1 DESC...

Это будет так? Почему?

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

Сообщение Rojohn » 16.01.2006 (Пн) 12:33

Просто получится, что мы выбираем три раза, а надо выбрать единожды одну запись и выдать значения трех её полей...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.01.2006 (Пн) 12:36

что то ты очень сумбурно объясняешь, что тебе надо.

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

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

Сообщение Rojohn » 16.01.2006 (Пн) 12:44

Есть таблица адресов, в которой есть поля REGION_CODE (код региона) и REGION_DEPT (наименование населенного пункта). Надо выдать количество каждого из наименований населенных пунктов, найти населенный пункт, наименование которого больше всего встречается и выдать его наименование, количество повторений и код региона, которому он соответствует.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.01.2006 (Пн) 13:00

Это кол-во регионов:

Код: Выделить всё
select
  COUNT(Region_Code) as CNT,
  Region_Dept as RegionName,
  Region_Code as Code
FROM ADDRESS
GROUP BY Region_Code, Region_Dept
ORDER BY Region_Dept



Это регион, который больше всех встречается:

Код: Выделить всё
SELECT
MAX(A.MaxCount) as MaxCount,
First(A.Region_Dept) as RegionName,
First(A.Region_Code) as Code
FROM
(
SELECT
  COUNT(Region_Code) as MaxCount,
  Region_Dept as RegionName,
  Region_Code as Code
FROM ADDRESS
GROUP BY Region_Code, Region_Dept
) A

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

Сообщение Rojohn » 16.01.2006 (Пн) 13:34

А чем этот вариант отличается от :
Код: Выделить всё
SELECT TOP 1
   Count(ADDRESS.REGION_DEPT) AS RN,
   First(ADDRESS.REGION_DEPT) AS Tit,
   First(ADDRESS.REGION_CODE) As RC
From Address
WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1))
GROUP BY ADDRESS.REGION_DEPT
ORDER BY 1 DESC


? Я же так пытался вначале писать - мне сказали, что неправильная структура эта (см. начальный запрос) ... :)

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

Сообщение Rojohn » 16.01.2006 (Пн) 14:11

В общем думаю, что этот вариант всёже подходит...
Код: Выделить всё
SELECT TOP 1
   Count(ADDRESS.REGION_DEPT) AS RN,
   First(ADDRESS.REGION_DEPT) AS Tit,
   First(ADDRESS.REGION_CODE) As RC
From Address
WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1))
GROUP BY ADDRESS.REGION_DEPT
ORDER BY 1 DESC;


Спасибо, вы мне очень помогли вдвоем!

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.01.2006 (Пн) 14:14

Этот запрос выводит максимальный по кол-ву повторений Регион, у которого тип UR и он активен, но этот запрос можно упростить:

Код: Выделить всё
SELECT TOP 1
   Count(REGION_DEPT) AS RN,
   REGION_DEPT AS Tit,
   REGION_CODE As RC
From Address
WHERE (((ADDRESS.TYPE_ADDR)='UR') AND ((ADDRESS.ACTIV)=1))
GROUP BY REGION_DEPT, REGION_CODE
ORDER BY 1 DESC

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

Сообщение blinow » 22.01.2006 (Вс) 4:15

Konst One правильно составил запрос, и по нему будет самый быстрй ответ от базы. Но опять все забывают, а если Count(REGION_DEPT) максимальный у нескольких строк? Тогда мы получим в принципе ошибочный ответ. :cry:


Вернуться в Базы данных

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList