Имя: Пароль:
1C
1С v8
Помогите плз с запросом
, ,
0 DasTPID
 
21.08.12
18:27
Добрый день!

Имеется таблица(Дата, Номенклатура, Признак)
Например:
01.08.2012 Номенклатура1 ложь
02.08.2012 Номенклатура1 истина
03.08.2012 Номенклатура1 ложь
04.08.2012 Номенклатура1 истина

В результате выполнения запроса нужно получить таблицу с 32 колонками (Номенклатура, ПризнакНа1Число, ПризнакНа2Число, ... , ПризнакНа31Число) вида

Номенклатура1 ложь истина ложь истина ...
Номенклатура2 .....
....
1 Defender aka LINN
 
21.08.12
18:28
(0) Цена вопроса?
2 Eugene_life
 
21.08.12
18:29
(0) А пропуски по датам возможны?
3 DasTPID
 
21.08.12
18:30
Делал похожую задачу, только вместо булевого признака было количество:
вложенным запросом выбрал
Номенклатура,
ВЫБОР КОГДА ДЕНЬ(Дата) = 1 ТОГДА Количество ИНАЧЕ 0 КОНЕЦ КАК КоличествоНа1Число,
ВЫБОР КОГДА ДЕНЬ(Дата) = 2 ТОГДА Количество ИНАЧЕ 0 КОНЕЦ КАК КоличествоНа2Число,
....

а потом сгруппировать по Номенклатура

но для булевых агрегатных функций нет и как это сделать я пока в ступоре
4 GROOVY
 
21.08.12
18:30
ВЫБРАТЬ
Дата, Номенклатура, Признак
ИЗ
НазваниеТаблицы

Все.
5 DasTPID
 
21.08.12
18:31
(1) Осознание бескорыстной помощи людям - бесценно!

(2) Да, пропуски возможны
6 GROOVY
 
21.08.12
18:32
(2) А какая разница? Если данные выводить в СКД то есть "дополнение", если выводить обходом запроса, то есть итоги по периодам, и пр.
7 DasTPID
 
21.08.12
18:32
(4) В выборке тогда будет три колонки - Дата, Номенклатура и Признак. А должно быть 32
8 JesteR
 
21.08.12
18:33
(4)С 32 колонками?
9 mrd2006
 
21.08.12
18:34
А почему 32 ?
10 Жан Пердежон
 
21.08.12
18:35
(4) При обходе результат запроса создай новую ТЗ
11 DasTPID
 
21.08.12
18:36
(9) Одна колонка - Номенклатура, и 31 - Признак на n-ный день месяца
12 GROOVY
 
21.08.12
18:36
(7) Количество полей в запросе не равно количеству колонок в результирующем формате вывода данных.
13 GROOVY
 
21.08.12
18:37
14 GROOVY
 
21.08.12
18:38
+13 создай в базе регистр сведений с названием регистрСведений1 и полями как в (0) и заполни его за январь текущего года. Посмотри отчет.
15 DasTPID
 
21.08.12
18:41
(13) Очень хотелось бы обойтись без СКД
16 GROOVY
 
21.08.12
18:44
(15) Обойдись без СКД.

Перебрать результат запроса можно в конструкции:
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
//Выводим строку
ВыборкаКолонки = Выборка.Выбрать()
ПОка ВыборкаКолонки.Слудующий() Цикл
//Выводим колонки
17 DasTPID
 
21.08.12
18:48
(16)
Это да, но мне не нужно перебирать результат запроса, мне нужно результат положить во временную таблицу, которая участвует в следующем запросе
18 GROOVY
 
21.08.12
18:49
(17) И каким образом ты собираешься использовать таблицу в которой тебе неизвестно количество и название полей?
ем не устраивает таблица Номенклатура|Дата|Признак ?
19 MegaKent2
 
21.08.12
18:52
(17) думаю тебе стоит делать запрос динамически кодом.
(18) а они скорее всего потом к ней данные привязывают ... типа продажи и т.п.
20 mrd2006
 
21.08.12
18:52
(17) Тогда перебирай результаты и ложи их в таблицу значений, которую потом можно задать в качестве параметра
21 DasTPID
 
21.08.12
18:53
(18) Как это неизвестно? Известно! Полей будет ровно 32. Названия у них будут

Номенклатура
ПризнакНа1Число
ПризнакНа2Число
...
ПризнакНа31Число

Если число дней меньше 31 в этом месяце, ну или в регистре сведений нет данных о каком-то дне, то получаемое значение может быть ЛОЖЬ или NULL, непринципиально, но поле такое всё равно будет
22 GROOVY
 
21.08.12
18:56
Тогда ничего не мешает использовать конструкцию ВЫБОР КОГДА Число=Нужное ТОГДА Признак ИНАЧЕ Ложь и группировать потом. Но ИМХО изврат какойто в задаче.
23 DasTPID
 
21.08.12
18:57
(20) Очень сильно пострадает быстродействие. Сейчас у меня в результирующем запросе участвует 9 вложенных таблиц, он выполняется около 1.5 секунд. Если разбирать хотя бы одну вложенную таблицу, то время выполнения навскидку увеличится на порядок
24 DasTPID
 
21.08.12
18:58
(22) Так в этом и вопрос - я не знаю как сгруппировать по полю с типом "булево"!
25 DasTPID
 
21.08.12
19:00
(22)
Пример:

Номенклатура1 ложь ложь истина
Номенклатура1 ложь истина ложь
Номенклатура1 истина ложь ложь

Как по-нормальному её сгруппировать по полю номенклатура?
26 DasTPID
 
21.08.12
19:04
+25
по-нормальному это значит без извратов, а то мысли привести ЛОЖЬ к 0, ИСТИНА к 1, агрегатной функцией выбрать сумму или среднее или количество различных и потом её анализировать мне и самому в голову приходили
27 Dmitry77
 
21.08.12
19:06
ВЫБОР КОГДА признак = истина ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК признак

и можешь хоть гагрупироваться
28 DasTPID
 
21.08.12
19:09
(27) О, я ж говорю, извращенцы мыслят одинаково :) Таки надо без извратов. Например, замени булево значение на какой-нибудь справочник и твой метод уже не будет работать
29 ChAlex
 
21.08.12
19:11
Если это нужно отобразить пользователю - то СКД - все просто, элементарно, минимум программирования (можно сказать вообще без него) и кроме всего в дальнейшем не так страшно будет пользоваться СКД - совет. Лучше день потерять и за 5 минут долететь :) - советую
30 DasTPID
 
21.08.12
19:15
(29) 100% нужно положить во временную таблицу

А с СКД конечно надо бы разобраться...
31 DasTPID
 
22.08.12
08:40
Мне тут подсказали, что то, что я хочу - называется перекрестный запрос

(29) Ты ж сам недавно спрашивал подобное v8: Как создать кросс-таблицу в запросе?
Нашёл что-нибудь?
32 DasTPID
 
22.08.12
17:36
Итак, решение:

Номенклатура,
МИНИМУМ(ВЫБОР КОГДА ДЕНЬ(Дата) = 1 ТОГДА Признак ИНАЧЕ NULL КОНЕЦ) КАК ПризнакНа1Число,
МИНИМУМ(ВЫБОР КОГДА ДЕНЬ(Дата) = 2 ТОГДА Признак ИНАЧЕ NULL КОНЕЦ) КАК ПризнакНа2Число,
...
ГРУППИРОВАТЬ ПО
Номенклатура


Суть в том, что минимум из NULL и булева значения всегда будет значением (так же, как и максимум). Поэтому, группировка по номенклатуре таблицы из (25) даёт нужный результат
33 ChAlex
 
22.08.12
19:56
(31) - в том то и дело, что просто в запросе универсально это не решить, если количество колонок известно, то путем соединения и группировок вообще-то можно, но может оказаться очень большие объемы данных при большом количестве колонок, поэтому для себя вопрос закрыл именно через СКД.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс