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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2009, 00:03   #1
Talemir
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 62
По умолчанию Дублирующиеся строки в DBGrid

Хочу вернуться еще раз к данному вопрусу, и надеюсь на вашу помощь.
Имею БД Access которая состоит из несколька таблиць, и вот я формирую
запрос на выборку из несколька таблиц и по ключевым полям.
Пример:
DM.ADOQuery2.Close;
DM.ADOQuery2.SQL.Clear;
DM.ADOQuery2.SQL.Add('SELECT ObjList.Number, ObjList.Name, ');
DM.ADOQuery2.SQL.Add('ObjList.Addre ss, EvType.Name,EvType.Name,');
DM.ADOQuery2.SQL.Add('EvList.Info, Person.Status,');
DM.ADOQuery2.SQL.Add('Person.FirstN ame,FROM');
DM.ADOQuery2.SQL.Add('EvList, EvType, ObjList, Person WHERE');
DM.ADOQuery2.SQL.Add('EvList.EvId=E vType.ID AND EvList.ObjId=ObjList.ID AND');
DM.ADOQuery2.SQL.Add('EvList.Operat orID=Person.ID AND EvType.ID=2621');
DM.ADOQuery2.Open;

Запрос работает, выберает в DBGrid данные которые повторяются
Пример:
1-Семенов/Симферопль
2-Кабанов/Ужгорд
1-Семенов/Симферопль
3-Иванов/Таганрог
4-Сюсюнин/Ялта
1-Семенов/Симферопль
3-Иванов/Таганрог
2-Кабанов/Ужгорд
3-Иванов/Таганрог
Но мне необходимо Что бы в DBgride эти данные формировались 2-ве и более записи и каждой записи выводило их колличество повторов
Пример:
1-Семенов/Симферопль/3-ЗАПИСИ
3-Иванов/Таганрог/3-ЗАПИСИ
2-Кабанов/Ужгорд/2-ЗАПИСИ
Я воспользовался советом расматривавшийся раньше:
select f_id, f_name, count(*) cnt from t group by f_id, f_name
having count(*)>2
order by f_name
но у вы моя соображалка не догоняет как его применить.
Я делал так:
DM.ADOQuery2.Close;
DM.ADOQuery2.SQL.Clear;
DM.ADOQuery2.SQL.Add('SELECT ObjList.Number, ObjList.Name, ');
DM.ADOQuery2.SQL.Add('ObjList.Addre ss, EvType.Name,EvType.Name,');
DM.ADOQuery2.SQL.Add('EvList.Info, Person.Status,');
DM.ADOQuery2.SQL.Add('Person.FirstN ame,COUNT(*) FROM');
DM.ADOQuery2.SQL.Add('EvList, EvType, ObjList, Person WHERE');
DM.ADOQuery2.SQL.Add('EvList.EvId=E vType.ID AND EvList.ObjId=ObjList.ID AND');
DM.ADOQuery2.SQL.Add('EvList.Operat orID=Person.ID AND EvType.ID=2621,HAVING COUNT(*)>2');
DM.ADOQuery2.Open;

Что-то я упускаю или вобще не так делаю, Будте снисходительными помогите направте на верный путь!!!
Talemir вне форума Ответить с цитированием
Старый 07.09.2009, 11:16   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пример с табличкой Ассеss сделайте, посмотрим...

Прежде всего, я не знаю, что и откуда Вы копировали.
но вот этот запрос вообще НЕ РАБОЧИЙ:
Цитата:
Код:
DM.ADOQuery2.SQL.Add('Person.FirstName,FROM');
во-вторых, если Вы укажите having count(*)>2
то вот этого:
2-Кабанов/Ужгорд/2-ЗАПИСИ
Вы вообще не увидите! (2 записи не больше чем 2)

и ещё я вижу, что Вы выбираете кучу полей ObjList.Number, ObjList.Name, ObjList.Address, EvType.Name,EvType.Name, EvList.Info, Person.Status, Person.FirstName
а повторы (группировку) по всем будете делать?
в SQL, если выборка группируется, можно выбирать только те поля, которые указаны в опциях группировки GROUP BY ...

и вообще, возьмите Вашу выборку и уже из неё
делайте SELECT ... FROM (select_Ваш_старый) GROUP BY ... HAVING COUNT(*)>1

p.s. если не разберётесь, запаковывайте тестовую базу и выкладывайте. разберёмся...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.09.2009, 13:03   #3
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

видел вчера тему, но лень было отвечать (все-таки ен уважаете вы участников форума и тегами ен пользуетесь в принципе) и поздно уже

+ еще и свалили в кучу решение из предыдущей своей задачи, в которой стояло условие выбрать все повторы от 3х дублей и более
здесь же, как я понимаю, нужно показать просто все дублирующиеся строки с группировкой по куче полей
будет выглядеть как-то так
Код:
SELECT 
  ol.Number, 
  ol.Name, 
  ol.Address,
  et.Name,
  el.Info, 
  p.Status,
  p.FirstName,
  COUNT(*) cnt
FROM
  EvList el, 
  EvType et, 
  ObjList ol, 
  Person p
WHERE 0=0
  and el.EvId = et.ID 
  AND el.ObjId = ol.ID 
  AND el.OperatorID = p.ID 
  AND et.ID = 2621 
group by ol.Number, 
  ol.Name, 
  ol.Address,
  et.Name,
  el.Info, 
  p.Status,
  p.FirstName
HAVING COUNT(*)>1
но опять же
в примере указан список выборки по полям ol.Number, ol.Name, ol.Address
если так и нужно, то сократить лишние записи из списка выборки и группировки
soleil@mmc вне форума Ответить с цитированием
Старый 07.09.2009, 13:27   #4
Talemir
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 62
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а повторы (группировку) по всем будете делать?
Не могу понять данную фразу
Talemir вне форума Ответить с цитированием
Старый 07.09.2009, 13:46   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Цитата:
а повторы (группировку) по всем будете делать?
Не могу понять данную фразу
Вы в примере привели повторы трёх полей:
например,
2-Кабанов/Ужгорд
а выбираете к этим полям ещё:
et.Name,
el.Info,
p.Status,
p.FirstName

содержимое этих полей тоже повторяется? (Да/Нет)
Если не повторяется - такие строчки считать одинаковыми (и схлопывать, считая при этом количество повторов) или считать их разными?

p.s. в примере soleil@mmc это проблема решена так, что содержимое этих полей учитывать,и только если содержимое этих полей тоже повторится, только тогда учитывать повтор.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.09.2009, 14:26   #6
Talemir
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 62
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
Код:
SELECT 
  ol.Number, 
  ol.Name, 
  ol.Address,
  et.Name,
  el.Info, 
  p.Status,
  p.FirstName,
  COUNT(*) cnt
FROM
  EvList el, 
  EvType et, 
  ObjList ol, 
  Person p
WHERE 0=0
  and el.EvId = et.ID 
  AND el.ObjId = ol.ID 
  AND el.OperatorID = p.ID 
  AND et.ID = 2621 
group by ol.Number, 
  ol.Name, 
  ol.Address,
  et.Name,
  el.Info, 
  p.Status,
  p.FirstName
HAVING COUNT(*)>1
прикрепил ошибку Что то Я делаю не так
Изображения
Тип файла: jpg Ошибка.jpg (55.3 Кб, 126 просмотров)
Talemir вне форума Ответить с цитированием
Старый 07.09.2009, 14:29   #7
Talemir
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 62
По умолчанию

Вот сам код который я прописал
DM.ADOQuery2.Close;
DM.ADOQuery2.SQL.Clear;
DM.ADOQuery2.SQL.Add('SELECT Ob.Number, Ob.Name,');
DM.ADOQuery2.SQL.Add('Ob.Address, Et.Name,Et.Name, ');
DM.ADOQuery2.SQL.Add('El.Info, Pr.Status, Pr.FirstName,COUNT(*)cnt FROM ');
DM.ADOQuery2.SQL.Add('EvList El, EvType Et, ObjList Ob, Person Pr WHERE');
DM.ADOQuery2.SQL.Add('0=0 AND El.EvId=Et.ID AND El.ObjId=Ob.ID AND');
DM.ADOQuery2.SQL.Add('El.OperatorID =Pr.ID AND Et.ID=2621 group by ');
DM.ADOQuery2.SQL.Add('Ob.Number,Ob. Name,Ob.Address,Et.Name,El.Info,Pr. Status,');
DM.ADOQuery2.SQL.Add(' Pr.FirstName HAVING COUNT(*)>1');
DM.ADOQuery2.Open;
Talemir вне форума Ответить с цитированием
Старый 07.09.2009, 15:33   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пробел потеряли между функцией и именем столбца:
Код:
COUNT(*) cnt
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.09.2009, 15:43   #9
Talemir
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 62
По умолчанию

Я у же испробовал ни чего, все та же ошибка!!!
Когда я убираю все эти функции Запрос работает в старом режиме, выбирает с повторяющиеся строками

Последний раз редактировалось Talemir; 07.09.2009 в 15:52.
Talemir вне форума Ответить с цитированием
Старый 07.09.2009, 16:35   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

попробуй так
Код:
having count(Ob.*)>1
и полный запрос будет таким
Код:
SELECT 
  ol.Number, 
  ol.Name, 
  ol.Address,
  et.Name,
  el.Info, 
  p.Status,
  p.FirstName,
  COUNT(Ob.*) cnt
FROM
  EvList el, 
  EvType et, 
  ObjList ol, 
  Person p
WHERE 0=0
  and el.EvId = et.ID 
  AND el.ObjId = ol.ID 
  AND el.OperatorID = p.ID 
  AND et.ID = 2621 
group by ol.Number, 
  ol.Name, 
  ol.Address,
  et.Name,
  el.Info, 
  p.Status,
  p.FirstName
HAVING COUNT(Ob.*)>1
soleil@mmc вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление выделенной строки из DBGrid Sinker БД в Delphi 9 20.05.2011 03:09
смена цвета строки dbgrid - ? Evgenii БД в Delphi 3 04.07.2009 07:57
Удалить определенные строки DBGrid Serval Помощь студентам 2 08.05.2009 08:20
Удаление строки из DBGrid XATAB БД в Delphi 3 10.03.2009 08:29
DBGrid (Строки и заголовок) chingiz Компоненты Delphi 3 06.10.2007 14:49