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 написание функции проходит, а на этапе непосредственного выполнения запроса - выдается ошибка.


Sandman25   (2004-07-08 15:30:00) [1]

[31] alexe   (08.07.04 15:27)

Если Count(distinct contractname) не поддерживается, то действительно одним запросом не обойтись.


alexe   (2004-07-08 15:27:00) [2]

ТО Reindeer Moss Eater & Sandman25
Попробую объяснить понятнее.
Допустим, есть клиент1, который взял продукт1 2 раза по договору1, 3 раза по договору2 и 1 раз по договору3. Нужно определить, по скольким договорам осуществлялась отгрузка. В данном случае по трем (именно не общее количество огрузок - 6, не количество отгрузок по договорам - 2,3 и 1 соответственно, а количество договоров для данного клиента по данному продукту - 3).
В общем, все больше укрепляюсь в мнении, что без промежуточной таблицы не обойтись.


Sandman25   (2004-07-08 15:13:00) [3]

В [18] и [28] написаны противоречащие друг другу предложения.


Reindeer Moss Eater   (2004-07-08 15:10:00) [4]

Если клиент десять раз взял один и тот же договор, почему должно быть 1?

Твоя проблема не имеет отношения ни к БД ни к SQL
Определись сначала что ты хочешь посчитать в терминах реального мира, предметной области. А уж потом надо писать запрос


alexe   (2004-07-08 14:58:00) [5]

То Johnmen
Кажется узнал :)) Любая попытка использовать конструкцию COUNT(DISTINCT ...) приводит к ошибке (надо было сразу не умничать и попробовать в простом запросе :)).

To Reindeer Moss Eater
Контсрукция select distinct(продукт,клиент,договор), если я правильно понял мысль, даст лишь список:
продукт1/клиент1/договор1
продукт1/клиент1/договор2
...
продукт1/клиент1/договорN
А мне нужно одну строку:продукт1/клиент1/всего договоров1,2,...,N


Reindeer Moss Eater   (2004-07-08 14:52:00) [6]

потому что "договор ...

Да какая разница почему именно?
Не нужен ему count.

select ...,..., 1from ....

даст то же самое.


sniknik   (2004-07-08 14:49:00) [7]

> Он в колонке count всегда ждет 1.
потому что "договор" пропушено, договор у него должен быть всегда 1 а вот привязанный к этому договору отгрузок переменное количество. он и вчитает отгрузки но договор не учитывает, он у него "выпал" из расчетов а теоретически отгрузки должны к нему быть привязаны.


Reindeer Moss Eater   (2004-07-08 14:46:00) [8]

Он в колонке count всегда ждет 1.
И расстривается когда там > 1

не нужен ему count.


sniknik   (2004-07-08 14:44:00) [9]

> и накакие count тебе не нужны
насколько понял нужно, но немного не в том контексте как сейчас делается

нужно
продукт1/клиент1/договор1/кол-во отгрузок по договору1
продукт1/клиент1/договор2/кол-во отгрузок по договору2
...
в таком виде колво должно считатся.


sniknik   (2004-07-08 14:40:00) [10]

> продукт1/клиент1/договор1;
> продукт1/клиент1/договор2

тогда тут групировка не нужна, или наоборот нужно вкючить в нее и договор. в показаном у тебя только по продукт1/клиент1.

а вот для "кол-во отгрузок по договору2" обязательно нужнно в групировку договор добавлять, иначе считаеш не пойми что.


Reindeer Moss Eater   (2004-07-08 14:40:00) [11]

А мне нужно исключить из подсчета 9 лишних, что я и пытаюсь сделать :))

Ты пытаешься получить строго детерминированный результат с помощью запроса.
Зачем тебе count, если ты точно знаешь, что он должен вернуть единицу и ничего больше?

тебе нужны все существующие уникальные пары продукт - клиент.
и накакие count тебе не нужны


Reindeer Moss Eater   (2004-07-08 14:37:00) [12]

продукт1/клиент1/ 1

select distinct(продукт,клитент) .....

И не надо никаких count


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

>alexe   (08.07.04 14:31) [18]

Узнай сам. :)
SELECT COUNT(DISTINCT ProductName)
FROM PRODUCT1

и
SELECT ProductCode, COUNT(DISTINCT ProductName)
FROM PRODUCT1
GROUP BY ProductCode


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

То Reindeer Moss Eater
С этим я согласен, что правильно выдается 10! А мне нужно исключить из подсчета 9 лишних, что я и пытаюсь сделать :))
Раскопал даже формат ф-ции Count(Distinct <...>), а в таком виде она не работает.


alexe   (2004-07-08 14:31:00) [15]

То Johnmen
А эта проблема Access'a "врожденная" или конкретной копии, или Access97 ?

To Reindeer Moss Eater
Count не врет. Без него выдается:
продукт1/клиент1/договор1
продукт1/клиент1/договор1
с ним: продукт1/клиент1/2, а должен/нужно (по моим понятиям :)) продукт1/клиент1/1


Reindeer Moss Eater   (2004-07-08 14:18:00) [16]

т.е. если клиент брал продукт 10 раз, то получаю количество 10, хотя договор один и тот же.

... ClientName, Count(ContractName)

Ну и что же ты хочешь?
В десяти записях есть информация о том, что клиент брал один и тот же продукт.
Count(ContractName) тебе честно об этом сообщает.


alexe   (2004-07-08 14:15:00) [17]

То sniknik
Если убрать ContractName, то получиться список продукт+клиент, а как добраться до договора? Ситуация такова, что нужно получить из выборки продукт1/клиент1/договор1; продукт1/клиент1/договор2 и т.д. продукт1/клиент1/кол-во отгрузок по договору1; продукт1/клиент1/кол-во отгрузок по договору2 и т.д., причем, желательно, не создавая промежуточную таблицу для хранения выборки продукт1/клиент1/договор1; продукт1/клиент1/договор2 и т.д.


Reindeer Moss Eater   (2004-07-08 14:07:00) [18]

Убери count и group by.

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

Во первых убедишься, что count тебе не врет
Во вторых поймешь каких условий в объединении нехватает.


Ильш   (2004-07-08 14:07:00) [19]

select P.ProductName, C.ClientName, (select count(*) from CONTRACT1 Cnt) as kolvo from tbl...
типа такого


Johnmen   (2004-07-08 14:06:00) [20]

>alexe

Запрос в части COUNT(DISTINCT <column specification>) соответствует стандарту SQL92.
Если проблемы именно из-за такого каунта, то это проблема Аксеса.


Страницы:   1 2

Наверх

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