|
Запрос на выборку уникальных записей | ☑ | ||
|---|---|---|---|---|
|
0
yegorka
14.07.10
✎
09:07
|
Подскажите как сделать чтобы в запросе выбирались только уникальные записи?
Запрос такой: ===================================================================== ТекстЗапроса = "//{{ЗАПРОС(ВыбратьДоки) |Период с ДатаНачала по ДатаКонца; |Контр = Документ.Реализация.Получатель; |Регион = Документ.Реализация.Получатель.Город; |Подгруппа = Документ.Реализация.Получатель.Родитель; |Функция Счётчик = Счётчик(); |Группировка Регион;"; УсловиеЗапроса = " |Условие(Подгруппа = Кат); |ОбрабатыватьДокументы Проведенные; |"//}}ЗАПРОС ; ===================================================================== Смысл в том, что нужно по документам посчитать сколько клиентов отоварились с группировкой по региону. Естественно, в эту выборку попадает один клиент столько раз сколько он отгружался. Как выбрать уникальных клиентов ("Контр")? Пожелания: не предлагать ввести вторую группировку по "Контр" |
|||
|
1
chelentano
14.07.10
✎
09:08
|
(0) считай количество потом
|
|||
|
2
yegorka
14.07.10
✎
09:09
|
Поподробнее, плиз. Выгружать в ТЗ???
|
|||
|
3
chelentano
14.07.10
✎
09:12
|
(2) можно и в ТЗ
|
|||
|
4
DrZombi
гуру
14.07.10
✎
09:13
|
(0)Прямой запрос не предлагать ;) (?)
|
|||
|
5
yegorka
14.07.10
✎
09:14
|
Предлагать
|
|||
|
6
Ёпрст
гуру
14.07.10
✎
09:15
|
(0) добавить группировку по Контр и выкинуть нелепую переменную Подгруппа из текста запроса
|
|||
|
7
yegorka
14.07.10
✎
09:16
|
Она на нелепая, очень нужная мне -- мне нужно в отчете группы справочника. И иерархия должна соблюдаться.
|
|||
|
8
yegorka
14.07.10
✎
09:17
|
Т.е. фактически это еще одна "не лепая" группировка. Но так справочник организовали.
|
|||
|
9
PaulBC
14.07.10
✎
09:18
|
(7) Условие(Контр В Кат);
|
|||
|
10
yegorka
14.07.10
✎
09:20
|
2 PaulBC: не понял, это чтоб выбрать уникальные, или чтоб избавиться от нелепой переменной??
|
|||
|
11
Ёпрст
гуру
14.07.10
✎
09:23
|
(7) они и так будут:
ТекстЗапроса = "//{{ЗАПРОС(ВыбратьДоки) |Период с ДатаНачала по ДатаКонца; |Контр = Документ.Реализация.Получатель; |Регион = Документ.Реализация.Получатель.Город; |Функция Счётчик = Счётчик(); |Группировка Регион; |Группировка Контр; |Условие(Подгруппа = Кат); |"//}}ЗАПРОС |
|||
|
12
Ёпрст
гуру
14.07.10
✎
09:23
|
ТекстЗапроса =
"//{{ЗАПРОС(ВыбратьДоки) |Период с ДатаНачала по ДатаКонца; |Контр = Документ.Реализация.Получатель; |Регион = Документ.Реализация.Получатель.Город; |Функция Счётчик = Счётчик(); |Группировка Регион; |Группировка Контр; |Условие(Контр в Кат); |"//}}ЗАПРОС |
|||
|
13
Ёпрст
гуру
14.07.10
✎
09:24
|
копи-пасте сгубит..
|
|||
|
14
yegorka
14.07.10
✎
09:26
|
Сейчас проверю
|
|||
|
15
yegorka
14.07.10
✎
09:36
|
Дело в том что при второй группировке запрос орет "не было обращения к старшим уровням выборки". А мне как бы и не нужно к уровню "Контр" обращаться. Как обойти?
|
|||
|
16
yegorka
14.07.10
✎
09:39
|
Да и к тому же результаты моего первого и вашего предложенного не отличаются. Значит опять не уникальные попадают в выборку
|
|||
|
17
Ёпрст
гуру
14.07.10
✎
09:39
|
(15)
... Запрос.Выполнить("ТекстЗапроса"); Пока Запрос.Группировка(1) = 1 Цикл Сообщить("Запрос.Регион"); Пока Запрос.Группировка(2) =1 Цикл Сообщить("Запрос.Контр"); .......... |
|||
|
18
yegorka
14.07.10
✎
09:49
|
С двуми группировками фигня в результатах запроса.
Мне нужен отчет такого вида: ========================================================================== ЭлементГруппыСправочника01 ЗначениеГруппировкиПоРегиону01_УникальныеПолучатели ЗначениеГруппировкиПоРегиону02_УникальныеПолучатели ... ЭлементГруппыСправочника02 ЗначениеГруппировкиПоРегиону01_УникальныеПолучатели ЗначениеГруппировкиПоРегиону02_УникальныеПолучатели ... ... |
|||
|
19
Ёпрст
гуру
14.07.10
✎
09:55
|
(18) Это как ?
сейчас, ежели как в (17) у тебя так: регион - Васюки группа Клиентосы Вася Федя группа Прочие клиентосы Маша Таня регион - Ебунёво группа Клиентосы Семён Евлампий группа Поставщики Ромашка Ежели поменяешь группировки местами, будет группа Клиентосы Вася регион - Васюки Федя регион - Васюки Семён регион - Ебунёво Евлампий регион - Ебунёво группа Прочие клиентосы Маша регион - Васюки Таня регион - Васюки группа Поставщики Ромашка регион - Ебунёво а что тебе нужно - хз. |
|||
|
20
yegorka
14.07.10
✎
09:56
|
Вот запрос:
================================================================================ ТекстЗапроса = "//{{ЗАПРОС(ВыбратьДоки) |Период с ДатаНачала по ДатаКонца; |Контр = Документ.Реализация.Получатель; |Регион = Документ.Реализация.Получатель.Город; |Функция Счётчик = Счётчик(); |Группировка Регион;"; УсловиеЗапроса = " |Условие(Контр В Кат); |ОбрабатыватьДокументы Проведенные; |"//}}ЗАПРОС ; ================================================================================ Вот отчет: ================================================================================ Магазины (Область) Вичуга 80 Волгореченск 18 Гаврилов Посад 2 Заволжск 38 Кинешма 148 Комсомольск 74 Лежнево 76 Наволоки 32 Палех 35 Писцово 33 Плёс 13 Приволжск 117 Пучеж 34 Родники 90 Савино 27 Тейково 158 Фурманов 128 Шуя 77 Южа 70 Юрьевец 16 Магазины (г. Иваново) Иваново 918 Общепиты (HoReCa) Иваново 38 Наволоки 3 Приволжск 3 Тейково 3 Оптовики (Область) Кинешма 15 Приволжск 2 Родники 2 Тейково 2 Фурманов 2 Шуя 6 Южа 1 ================================================================================ В этом отчете мусор. Потому-что попадают клиенты столько раз сколько они встречаются в документах. Как избежать дублирования? |
|||
|
21
Ёпрст
гуру
14.07.10
✎
09:59
|
(20) да уж..Мусор в чем ? Где дубли в этом отчете ?
|
|||
|
22
yegorka
14.07.10
✎
10:07
|
Ну к примеру клиент "А" из группы справочника "Магазины (Область)" из города "Вичуга" отгружался за период N раз. Он в эту выборку и посчитается N раз. Мне нужно, чтобы от 1 раз считался.
|
|||
|
23
ДенисЧ
14.07.10
✎
10:08
|
Группировка Регион;
Группировка Контр; и убрать счётчик() |
|||
|
24
yegorka
14.07.10
✎
10:09
|
Если счетчик убрать, откуда я цифры возьму?
|
|||
|
25
Ёпрст
гуру
14.07.10
✎
10:09
|
(22) Ты хочешь чтоб у тебя в отчете везде 1-ки стояли напротив клиентоса, или что ?
Или ты хочешь подсчитать количество клиентосов по каждому региону ? Дык функция Счётчик считает не количество записей в группировке, если что, а количество записей, участвующих в выборке. |
|||
|
26
yegorka
14.07.10
✎
10:12
|
2 Ёпрст3: Нет, конечно. В этом отчете и нет клиентосов. Есть регионы откуда клиентосы.
Нужно знать, сколько клиентов из региона отоварилось (а не сколько было отгрузок в регион) за период, в разрезе групп справочника. |
|||
|
27
Ёпрст
гуру
14.07.10
✎
10:13
|
(26)
Магазины (Область) Магазины (г. Иваново) ... Это что ? Гаврилов Посад 2 Заволжск 38 Кинешма 148 Комсомольск 74 Лежнево А это что ? |
|||
|
28
yegorka
14.07.10
✎
10:15
|
Магазины (Область)
Магазины (г. Иваново) Это -- группы справочника Получатели. Гаврилов Посад 2 Заволжск 38 Кинешма 148 Комсомольск 74 Лежнево Это -- регионы |
|||
|
29
yegorka
14.07.10
✎
10:16
|
Регионы это поле справочника получатели
|
|||
|
30
Ёпрст
гуру
14.07.10
✎
10:16
|
(28) и ка ты ЭТО получил при запросе в (20) ??????????????
|
|||
|
31
Ёпрст
гуру
14.07.10
✎
10:17
|
+ и видишь ли, если это ГРуппы справочника Получатели, то в 1 группе могут быть клиентосы с РАЗНЫМИ регионами, что очевидно..
|
|||
|
32
yegorka
14.07.10
✎
10:19
|
2 Ёпрст3: я же и запрос и отчет представил. Вот тогда еще кусочек, как строю отчет:
========================================================================= СчетчикЦикла = 0; Для СчетчикЦикла = 1 По Категории.РазмерСписка() Цикл // Кат = Категории.ПолучитьЗначение (СчетчикЦикла); // УсловиеЗапроса = " |Условие(Контр В Кат); |ОбрабатыватьДокументы Проведенные; |"//}}ЗАПРОС ; Если Запрос.Выполнить(ТекстЗапроса+УсловиеЗапроса)=0 Тогда Возврат;; КонецЕсли; // Таб.ВывестиСекцию ("Категории"); // // Пока Запрос.Группировка(1) = 1 Цикл Таб.ВывестиСекцию ("Точки"); КонецЦикла; КонецЦикла; ========================================================================= на (31) -- очевидно. Это отчет и отражает, вообще-то. |
|||
|
33
Ёпрст
гуру
14.07.10
✎
10:22
|
(32) да.. это полный ПЭ..
выполнение запроса в цикле..ппц. ЗЫ: так и не вкурил, что ты хочешь на самом деле. |
|||
|
34
yegorka
14.07.10
✎
10:23
|
Блин, а всего-то не хватает в этом языке запросов DISTINCT как в SQL.
|
|||
|
35
Ёпрст
гуру
14.07.10
✎
10:24
|
(34) ну и пиши на SQL, кто мешает ?
А так, на примере (20) напиши руками, какая должна быть табличка на выходе.. |
|||
|
36
yegorka
14.07.10
✎
10:25
|
на (34) я не умею на SQL писать под 1С. А так умею.
|
|||
|
37
Ёпрст
гуру
14.07.10
✎
10:27
|
(36) а чего там уметь то?
но для начала, выложи результирующую табличку, какая должна быть, а то хрен поймешь, что ты хочешь в итоге. |
|||
|
38
yegorka
14.07.10
✎
10:28
|
на (36) так как в (20) и должна быть на выходе табличка.
Только в: Магазины (Область) Вичуга 80 Волгореченск 18 Гаврилов Посад 2 Заволжск 38 Кинешма 148 Комсомольск 74 Лежнево 76 Наволоки 32 Палех 35 Писцово 33 Плёс 13 Приволжск 117 Пучеж 34 Родники 90 Савино 27 каждом регионе сейчас фактически количество отгрузок за период в данный регион. а нужно количество уникальных отгрузок. |
|||
|
39
Ёпрст
гуру
14.07.10
✎
10:29
|
(38) "уникальных" отгрузок, это как ?
|
|||
|
40
yegorka
14.07.10
✎
10:34
|
на (39): Клиент "А" из региона "Вичуга" отгрузился за период Н раз. В отчет он попадает Н раз. Клиент "Б" из региона "Вичуга" отгрузился за период М раз. В отчет он попадает М раз. Клиент "С" из региона "Вичуга" отгрузился за период К раз. В отчет он попадает К раз.
В итоге я получаю в отчете цифру по региону Н+М+К равную количеству _ВСЕХ_ отгрузок в регион "Вичуга". А мне нужно, только показать цифру 3, Так как это количество уникальных отгрузок. |
|||
|
41
Ёпрст
гуру
14.07.10
✎
10:42
|
(40) ну тупо так:
Перем СписокКлиентосов; Функция ПроверитьКлиентоса(Клиентос) Если СписокКлиентосов.НайтиЗначение(Клиентос)=0 Тогда СписокКлиентосов.ДобавитьЗначение(Клиентос); Возврат 1; КонецЕсли; Возврат 0; КонецФункции .......... СписокЗначений = СоздатьОбъект("СписокЗначений"); ТекстЗапроса = " |Период с ДатаНачала по ДатаКонца; |Контр = Документ.Реализация.Получатель; |Регион = Документ.Реализация.Получатель.Город; |Функция Счётчик = Счётчик()Когда(ПроверитьКлиентоса(Контр)=1); |Группировка Контр; |Группировка Регион; |Условие(Контр в ВыбКонтрагент); |
|||
|
42
PaulBC
14.07.10
✎
10:44
|
(40)
СчетчикУникальныхОтгрузок = 0; Пока Запрос.Группировка("Контр")=1 Цикл СчетчикУникальныхОтгрузок = СчетчикУникальныхОтгрузок+1; (32) Условие(Контр В Категории); // это вместо запроса в цикле |
|||
|
43
yegorka
14.07.10
✎
10:54
|
на (40): так группировка по Контр уже выбирает уникальных Контр.
|
|||
|
44
Ёпрст
гуру
14.07.10
✎
11:01
|
(43) эта функция не для счётчика, если что.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |