Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как исключить лишние записи из SQL-запроса, используя Count? [D5, Access]


Страницы:   1 2

alexe ©   (2004-07-08 13:19:00) 

Здравствуйте! Помогите, пожалуйста, решить следующую проблему.
Есть задача: получить количество договоров для каждого клиента по каждому продукту из БД в Access. Пишу запрос:
SELECT ProductName, ClientName, Count(ContractName)
....
Group by P.ProductName, C.ClientName
В результате получаю количество записей в БД по клиенту и продукту, в которых есть договор, т.е. если клиент брал продукт 10 раз, то получаю количество 10, хотя договор один и тот же.
Нашел функцию Count(Distinct <выражение>), т.е. выбор одной записи из нескольких одинаковых, но она упорно не хочет работать с Access. В SQL-builder написание функции проходит, а на этапе непосредственного выполнения запроса - выдается ошибка.


sniknik   (2004-07-08 14:05:00) [21]

убирая Count убираеш и ContractName из обьеденения.
но вообше я не настаиваю, надо смотреть на данных я чисто теоретически.


alexe   (2004-07-08 14:04:00) [22]

То Ильш
А можно поконкретнее?


alexe   (2004-07-08 14:01:00) [23]

То sniknik
Что-то я не понимаю, как мне поможет изменение внутреннего соединения на внешнее, если убирая Count, я получаю корректную выборку?


Ильш   (2004-07-08 13:59:00) [24]

а вложенные запросы как же??? прям заплакаль я....


sniknik   (2004-07-08 13:56:00) [25]

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


sniknik   (2004-07-08 13:54:00) [26]

обьеденение неявное т.е. inner join, т.е. выдаст все пересечения. а по условию нужно left join делать, или right.


alexe   (2004-07-08 13:53:00) [27]

To Johnmen
Выдается ошибка для ф-ции Count( distinct Cnt.ContractName):
"Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Count( distinct Cnt.ContractName)'".
А если использовать Count( distinct *) с добавлением в Group by Cnt.ContractName, то "Лишняя скобка ) в выражении запроса Count( distinct *)."

To Reindeer Moss Eater
Ручной подсчет не выход, т.к. это всего лишь подзадача, а загромаждать лишними циклами программу не есть хорошо в плане времени ее выполнения, т.к. анализируемых записей может быть до нескольких десятков тысяч :((


Reindeer Moss Eater   (2004-07-08 13:39:00) [28]

Убери count и group by.
Получи датасет и посчитай кол-во руками, внимательно глядя на содержимое полей в наборе данных


Johnmen   (2004-07-08 13:37:00) [29]

Как именно Count(Distinct <выражение>)не хочет работать ?


alexe   (2004-07-08 13:34:00) [30]

To Reindeer Moss Eater
Функцию нашел в книге Шумакова П.В. "Delphi3 и разработка приложений баз данных".
Привожу полный запрос:
SELECT P.ProductName, C.ClientName, Count(Cnt.ContractName)
FROM CLAIM1 Cl, REPORT1 R, CLIENT1 C, LOAD L, PRODUCT1 P, CONTRACT1 Cnt
WHERE  (R.ReportCode = Cl.ClaimReport)  
  AND  (C.ClientCode = Cl.ClaimContragent)  
  AND  (P.ProductCode = R.ReportProduct)  
  AND  (L.LoadReport = Cl.ClaimReport)  
  AND  (L.LoadLetter = Cl.ClaimLetter)  
  AND  (L.LoadContract = Cnt.ContractCode)  
  AND  ( (R.ReportYear = 2004)  
  AND  (R.ReportMounth = 5) )
Group by P.ProductName, C.ClientName


Reindeer Moss Eater   (2004-07-08 13:26:00) [31]

SELECT ProductName, ClientName, Count(ContractName)
....
Group by P.ProductName, C.ClientName


А условие объединения нам самим домыслить?


Reindeer Moss Eater   (2004-07-08 13:23:00) [32]

а на этапе непосредственного выполнения запроса - выдается ошибка.

Это очень плохо.
Но скоро это пройдет само собой.

Нашел функцию Count(Distinct <выражение>),

Где ты такое нашел?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо