![]() |
| ||
|
|
Новости |
Поиск |
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 написание функции проходит, а на этапе непосредственного выполнения запроса - выдается ошибка.
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.
Если проблемы именно из-за такого каунта, то это проблема Аксеса.