как построить sql-запрос?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
goth
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 23.08.2005 (Вт) 11:57

как построить sql-запрос?

Сообщение goth » 24.08.2005 (Ср) 15:52

здравствуйте!

кто может подсказать как посторить запрос, результатом которого будет два поля. первое - уникальные значения (select distinct name1 from table1) исходной таблицы, а вторым - число их встречающихся совпадений?

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

Сообщение Konst_One » 24.08.2005 (Ср) 16:06

Код: Выделить всё
select name1, count(*) as CNT from table1 group by name1

goth
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 23.08.2005 (Вт) 11:57

Сообщение goth » 24.08.2005 (Ср) 16:35

большое спасибо!!! а сгрупировать по столбцу подсчитанных начений можно?

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

Сообщение Konst_One » 24.08.2005 (Ср) 16:48

можно, а что ты хочешь из этого получить :?:

goth
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 23.08.2005 (Вт) 11:57

Сообщение goth » 25.08.2005 (Чт) 7:49

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

есть table1 [id, code], table2 [id, val1, val2].

1. провел агрегацию согласно Вашему совету
2. необходимо в этом же запросе, еще добавить поля описания val1 и val2 по условию table1.id = table2.id
3. сортировать по убыванию столбца count(). результат вида [code, val1, val2, count()], где count из первой части запроса

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

Сообщение GSerg » 25.08.2005 (Чт) 8:22

Код: Выделить всё
SELECT Table1.ID, First(Val1), First(Val2), COUNT(*)
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID
GROUP BY Table1.ID
Последний раз редактировалось GSerg 25.08.2005 (Чт) 11:37, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

goth
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 23.08.2005 (Вт) 11:57

Сообщение goth » 25.08.2005 (Чт) 8:38

GSerg писал(а):
Код: Выделить всё
SELECT Table1.ID, First(Val1), First(Val2) COUNT(*)
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID
GROUP BY Table1.ID


а First() - это видимо функция?

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

Сообщение alibek » 25.08.2005 (Чт) 8:43

Это агрегатная функция, но она есть не на всех БД.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение GSerg » 25.08.2005 (Чт) 8:45

Тогда
Код: Выделить всё
SELECT Table1.ID, Val1, Val2, COUNT(*)
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID
GROUP BY Table1.ID, Val1, Val2
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

goth
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 23.08.2005 (Вт) 11:57

Сообщение goth » 25.08.2005 (Чт) 8:53

alibek писал(а):Это агрегатная функция, но она есть не на всех БД.


я использую Oracle9i

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

Сообщение Konst_One » 25.08.2005 (Чт) 10:55

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

есть table1 [id, code], table2 [id, val1, val2].

1. провел агрегацию согласно Вашему совету
2. необходимо в этом же запросе, еще добавить поля описания val1 и val2 по условию table1.id = table2.id
3. сортировать по убыванию столбца count(). результат вида [code, val1, val2, count()], где count из первой части запроса


что-то странное ты задумал. если мы групируем по имени из первой таблицы и получаем кол-во появлений данного имени в таблице, то это не значит , что по id (который я подозреваю является ключем) можно сделать соответствие этим данным в таблице № 2, так как id в нашем случае при группировке неизвестен (он может быть любой из набора первой таблицы по name1).

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

goth
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 23.08.2005 (Вт) 11:57

Сообщение goth » 25.08.2005 (Чт) 11:30

две таблички вида:
первая таблица содержит набор временных событий
table1 t1
----------------------------
id, date, cat, code, ci_id
----------------------------
13, 10/08/2005 12:12, Категория1, codename1, 26536

вторая - справочник, содержит расшифровку объекта где произошло событие:
table2 t2
-------------------------
id, name1, name2, code
--------------------------
26536, название1, название2, codename1

необходимо построить запрос, результатом которого будет
------------------------------------
t1.code, t2.name1, t2.name2, count(*)

т.е. сгруппировать события в table1 по code и посчитать сколько было таких совпадений. Это выполняет запрос "select t1.code, count(*) as cnt from table1 t1 group by t1.code" получаем результат вида:
------------
codename1, 15
codename2, 8

т.е, строк, содержащих в table1 значение поля code "codename1" было 15, "codename2", соответственно 8.
теперь необходимо добавить к полученной таблице два поля name1 и name2, в соответствии с условием table1.ci_id = table2.id, взятых из таблицы-справочника t2
-------------------------------------------
t1.code, t2.name1, t2.name2, cnt
-------------------------------------------
codename1, название1, название2, 15

отфильтровать по table1.cat = 'Категория1' and (date >= date_from and date <= date_to), сортировать полученные значения по последнему столбцу-количеству совпадений count(*).

Собственно проблема - сформировать один sql - запрос. Реальное содержимое баз привести нет возможности.

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

Сообщение GSerg » 25.08.2005 (Чт) 11:35

Konst_One, не смущай общественность :)

http://bbs.vbstreets.ru/viewtopic.php?p=145698#145698 и http://bbs.vbstreets.ru/viewtopic.php?p=145715#145715 делают то, что нужно :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Konst_One » 25.08.2005 (Чт) 12:15

2 GSerg
ну ты как всегда экстрасенс :lol:

а то он сначала одно говорил:

кто может подсказать как посторить запрос, результатом которого будет два поля. первое - уникальные значения (select distinct name1 from table1) исходной таблицы, а вторым - число их встречающихся совпадений?


я ему это сделал:
Код: Выделить всё
select name1, count(*) as CNT from table1 group by name1


а в итоге, ему совсем другое нужно было :!:
вот ведь люди вопросы то как задают :x

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

Сообщение Konst_One » 25.08.2005 (Чт) 12:18

вязать тебе надо не :
Код: Выделить всё
table1.ci_id = table2.id

а по :
Код: Выделить всё
table1.code=table2.code

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

Сообщение Konst_One » 25.08.2005 (Чт) 12:22

Код: Выделить всё
select t1.code, t2.name1, t2.name2, count(*) as cnt
from table1 t1, table2 t2
WHERE
  t1.code=t2.code AND
  t1.cat = 'Категория1' AND
  t1.date >= :date_from and t1.date <= :date_to
group by t1.code, t2.name1, t2.name2


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

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

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

    TopList  
cron