Имя: Пароль:
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) - в том то и дело, что просто в запросе универсально это не решить, если количество колонок известно, то путем соединения и группировок вообще-то можно, но может оказаться очень большие объемы данных при большом количестве колонок, поэтому для себя вопрос закрыл именно через СКД.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан