Сравнение ячеек в БД.

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сравнение ячеек в БД.

Сообщение КсЮня » 24.08.2006 (Чт) 13:06

Подскажите, пожалуйста, это возможно? Расскажу на примере.
У меня есть таблица: Код, Улица, Этаж, Этажность и Цена. Код уникален. Улица Этаж и Этажность могут быть одинаковыми. Мне надо удалить все строки, в которых Улица Этаж и Этажность одинаковы, а Цена отличается на 300 у.е.( То есть если отличается больше, чем на 300, то удалять не надо. ). Можно ли как -то сравнить эти цены?
Буду очень благодарна за помощь)

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 24.08.2006 (Чт) 13:29

То есть если отличается больше, чем на 300, то удалять не надо

Отличается от чего?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.08.2006 (Чт) 13:31

Друг от друга.
Лучший способ понять что-то самому — объяснить это другому.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 24.08.2006 (Чт) 13:33

да, друг от друга

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 24.08.2006 (Чт) 14:50

    1)100
    2)300
    3)400
    4)610
    5)820
    6)920

Какие останутся, относительно одной записи раница меньше 300 а относительно другой больше, какие удалять а какие оставить?
или удалять цена у которых:
Код: Выделить всё
макс_цена_текущей_группы-цена_текущей_записи_в_текущей_группе <300

?

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 24.08.2006 (Чт) 15:01

кроме цен есть еще парметры: улица, этаж и тд. если они одинаковые, то надо сравнить цену по этим строчкам. если цена отличается меньша чем на 300 уе, то та строчка, в которой цена больше удаляется[/b]

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

Сообщение Konst_One » 24.08.2006 (Чт) 15:08

Ксюня, я бы конечно этот запрос тебе написал, но не буду.
учись сама. посдказка: запрос на группировку привязывается к другому запросу на сравнение сумм. :wink:

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 24.08.2006 (Чт) 15:15

я не понимаю, что такое запрос на сравнение сумм. поэтому и спрашиваю

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 24.08.2006 (Чт) 15:17

Konst_One, а может напишешь?;) мне ну оооооочень, оооооооочень надо!!! :cry:

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

Сообщение Konst_One » 24.08.2006 (Чт) 15:41

и не проси, пример сравнения:

Код: Выделить всё
Sum1<Sum2


Операторы сравнения:
>
<
=
<=
=>
<>

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

Сообщение Konst_One » 24.08.2006 (Чт) 15:46

бери книжку по проектированию БД и вперед :D

Основу реляционной модели составляет совокупность данных, объединен-ных в виде отношений (таблиц). Из теории множеств известно, что формальныманалогом любой таблицы является отношение.Пусть имеется некоторая совокупность множеств D1, D2, … DN. Отношением R на этих множествах называется подмножество их декартового произве-дения, где N - это степень отношения. Картеж - это совокупность элементов множеств, причем порядок имеет существенное значение, т.к. каждый элементмножества должен принадлежать только своему домену. Запись вида R(A,B,C)называется схемой отношения и наряду с названием отношения содержит име-на атрибутов. Совокупность схем отношений составляет схему реляционной БД. Количество картежей называется мощностью отношения...

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

Сообщение alibek » 24.08.2006 (Чт) 15:51

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

КсЮня, тебе Алексей К. не просто так примеры приводил. Условно считай, что в его списке улица, этаж и этажность совпадают, различны только цены. Какие строки ты будешь удалять?
Lasciate ogni speranza, voi ch'entrate.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 24.08.2006 (Чт) 19:09

Скорее всего это частный случай когда существует всего 2 записи, с одинаковыми данными за исключением цены.Так, КсЮня?
Если всё делать своими ручками, они скоро отвалятся !

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 24.08.2006 (Чт) 22:59

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

Konst_One, простите, если я задаю вопрос, я рассчитываю получить на него ответ? так как подумав, не поняла, как это делать. а к сожаленю подсказками мне не поможешь. но все равно спасибо

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 24.08.2006 (Чт) 23:37

КсЮня писал(а):alibek, на сколько я понимаю сравнение должно происходить по очереди начинаю с первой записи. тогда удаляются все последовательно до последней, последняя остатся.

КсЮня, в БД нет ячеек как в Экселе. Нет первой записи, нет последней, т.к. порядок вывода информации зависит от сортировки. Поэтому основы БД желательно все-таки подучить и более четко сформулировать задачу, иначе тебе трудно помочь.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 25.08.2006 (Пт) 7:08

Допустим в твоем большом наборе встречаются много записей у которых улица, этаж и этажность одинаковы, а отличается только цена, эти наборы образуют группы, например:
1-я группа
Ленина, 1,2, 100
Ленина, 1,2, 400
Ленина, 1,2, 800

2-я группа
Ленина, 3,4, 120
Ленина, 3,4, 440
Ленина, 3,4, 870
Ленина, 3,4, 980

3-я группа
Маяковского, 1,1,100
Маяковского, 1,1,300
Маяковского, 1,1,400
Маяковского, 1,1,610
Маяковского, 1,1,820
Маяковского, 1,1,920

Мне надо удалить все строки, в которых Улица Этаж и Этажность одинаковы, а Цена отличается на 300 у.е. ( То есть если отличается больше, чем на 300, то удалять не надо. )

Акцентируем свое внимание на 3-ей группе,
еще раз вопрос: какие записи ты удалишь из этой группы и почему (четкий алгоритм)?

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

Сообщение alibek » 25.08.2006 (Пт) 7:54

КсЮня писал(а):alibek, на сколько я понимаю сравнение должно происходить по очереди начинаю с первой записи. тогда удаляются все последовательно до последней, последняя остатся.

Другими словами -- тебе нужна запись с максимальной ценой, так?
Lasciate ogni speranza, voi ch'entrate.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 25.08.2006 (Пт) 9:53

Алексей К., так как все цены отличаются меньше чем на 300, то они по очереди все сравниваются: 100 и 300, 100 удаляется, 300 и 400, 300 удаляется и так до 820 и 920, 820 удаляется.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 25.08.2006 (Пт) 9:53

alibek, угу) и больше мне для счастья ничего не нужно)

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

Сообщение alibek » 25.08.2006 (Пт) 9:56

Тогда выполни этот запрос.
Код: Выделить всё
SELECT Улица, Этаж, Этажность, MAX(Цена)
FROM Таблица
GROUP BY Улица, Этаж, Этажность


Если он вернет те результаты, которые тебе нужны, тогда можно удалить все остальное.
Lasciate ogni speranza, voi ch'entrate.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 25.08.2006 (Пт) 10:05

неа, не то... просто все строки возвращает.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 25.08.2006 (Пт) 10:16

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

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 25.08.2006 (Пт) 10:20

неа, не то... просто все строки возвращает.

Запрос рабочий, если возвращает все строки - значит у тебя нет одинаковых записей у которых улица, этаж, этажность совпадает.

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 25.08.2006 (Пт) 10:32

Алексей К., еще раз объясняю, у меня еще есть уникальный код, из-за которого строки не одинаковые. но я не могу его не учитывать!!!

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

Сообщение Konst_One » 25.08.2006 (Пт) 10:58

структуру таблиц (скрипт) и данные в них - в студию :!:

отдельной акцессной бд

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 25.08.2006 (Пт) 11:17

КсЮня писал(а):еще раз объясняю, у меня еще есть уникальный код, из-за которого строки не одинаковые. но я не могу его не учитывать!!!

Поясни, пожалуйста, как ты хочешь учитывать уникальный код в контексте первоначального вопроса:
У меня есть таблица: Код, Улица, Этаж, Этажность и Цена. Код уникален. Улица Этаж и Этажность могут быть одинаковыми. Мне надо удалить все строки, в которых Улица Этаж и Этажность одинаковы, а Цена отличается на 300 у.е.( То есть если отличается больше, чем на 300, то удалять не надо. ). Можно ли как -то сравнить эти цены?

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

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 25.08.2006 (Пт) 11:50

Вот вариант рыбы:
Сначала заполняем recordset rs набором по запросу:
Код: Выделить всё
SELECT Улица, Этаж, Этажность, MAX(Цена)
FROM Таблица
GROUP BY Улица, Этаж, Этажность

потом:

Код: Выделить всё
redim data_safe(rs.recordcount,5)
i=1
do until rs.eof
query_text="select top 1 *  from table where улица="+rs.fields("улица")+" and этаж="+rs.fields("этаж")+" and этажность="+rs.fields("этажность")+" order by цена desc"
rs2.open query_text
data_safe(i,1)=rs2.fields(0)
data_safe(i,2)=rs2.fields(1)
data_safe(i,3)=rs2.fields(2)
data_safe(i,4)=rs2.fields(3)
data_safe(i,5)=rs2.fields(4)
rs2.close
i=i+1
rs.movenext
loop
rs.close

естественно при сборке query_text учесть типы данных в соответствии со структурой таблички
далее:
Код: Выделить всё
delete * from table

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

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 25.08.2006 (Пт) 18:37

Код Улица Этаж Этажность Цена
1 Героев Панфиловцев 2 3 400
34 Героев Панфиловцев 2 3 406
55 Алексеевская 4 8 308
59 Алексеевская 6 8 307
78 Кирпичная 7 9 400
89 Кирпичная 7 9 800

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

КсЮня
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 03.08.2006 (Чт) 12:17
Откуда: Мааасква

Сообщение КсЮня » 25.08.2006 (Пт) 18:48

Код_____Улица______________Этаж_____Этажность_____Цена
1_______Героев Панфиловцев___2_________3___________ 400
89______Кирпичная____________7_________9____________800
34______Героев Панфиловцев___2_________3___________ 406
55______Алексеевская_________4_________8___________ 308
59______Алексеевская_________6_________8____________307
78______Кирпичная___________ 7_________9____________400


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

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 25.08.2006 (Пт) 20:33

То же, что делает Алексей К., только одним запросом:
Код: Выделить всё
SELECT Kvartira.Code, Kvartira.UL, Kvartira.FLOOR, Kvartira.FLOORS, Kvartira.PRICE
FROM Kvartira
WHERE Kvartira.Price =
(SELECT max(price)
FROM Kvartira As Tmp
GROUP BY UL, FLOOR, FLOORS
HAVING Tmp.UL=Kvartira.UL And Tmp.FLOOR = Kvartira.FLOOR And Tmp.FLOORS = Kvartira.FLOORS)
ORDER BY Kvartira.UL, Kvartira.FLOOR, Kvartira.FLOORS;

Этот запрос для повторяющихся записей (по полям Улица, Этаж, Этажность) выводит те, у которых цена максимальная.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

След.

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

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

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

    TopList  
cron