![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как исключить лишние записи из SQL-запроса, используя Count? [D5, Access]
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 <выражение>),
Где ты такое нашел?