Конструкция Pivot в запросе

1. sound 535 04.12.09 15:25 Сейчас в теме
Есть регистр ЗначенияСвойствОбъектов, и справочник например "Склады",
По складам в регистр пишутся свойства (как в типовых). Требуется запросом получить данные по складам в разрезе этих свойств.
В SQL-е есть оператор Pivot для "переворачивания" таблиц, то есть данные выборки становятся полями другой выборки. А как бы извернуться с запросом в 1С?
Прикрепленные файлы:
+
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Borisych 503 05.12.09 00:20 Сейчас в теме
че-то я не понял желаемый результат :(
спать пора ложиться, наверное
+
4. sound 535 05.12.09 09:30 Сейчас в теме
(2) Желаемый результат на 2 картинке.
(3) Мне таблица нужна в таком виде для дальнейшей обработки, а то, что построитель это "нарисует" мне видимо не поможет
+
3. I_G_O_R 69 05.12.09 00:37 Сейчас в теме
запросом никак, но в отчет построитель или скд так нарисует нефиг делать
+
5. Трактор 1247 05.12.09 14:47 Сейчас в теме
Вот какое-то решение. Но всё-равно нужно знать какие свойства ты хочешь видеть

Выбрать
	"Товар1" КАК Товар,
	"Свойство1" КАК Свойство,
	"Значение 1" Как Знач
Поместить Свойства

Объединить все

Выбрать
	"Товар1" КАК Товар,
	"Свойство2" КАК Свойство,
	"Значение 2" Как Знач

Объединить все

Выбрать
	"Товар2" КАК Товар,
	"Свойство1" КАК Свойство,
	"Значение1 товар 2" Как Знач

Объединить все

Выбрать
	"Товар2" КАК Товар,
	"Свойство2" КАК Свойство,
	"Значение2  товар2" Как Знач

Объединить все

Выбрать
	"Товар2" КАК Товар,
	"Свойство3" КАК Свойство,
	"Значение3 товар2" Как Знач
;
Выбрать distinct
	Свойства1.Товар,
	Свойства2.Знач КАК Свойство1,
	Свойства3.Знач КАК Свойство2,
	Свойства4.Знач КАК Свойство3
	
Из
	Свойства КАК Свойства1
	Левое Соединение Свойства КАК Свойства2
	По Свойства1.Товар = Свойства2.Товар
	И Свойства2.Свойство = "Свойство1"

	Левое Соединение Свойства КАК Свойства3
	По Свойства1.Товар = Свойства3.Товар
	И Свойства3.Свойство = "Свойство2"

	Левое Соединение Свойства КАК Свойства4
	По Свойства1.Товар = Свойства4.Товар
	И Свойства4.Свойство = "Свойство3"
	
;
Уничтожить
	Свойства
Показать


глупость написал. Но пусть остаётся.
+
6. sound 535 06.12.09 13:05 Сейчас в теме
(5) Спасибо за ответ, хотя все равно идеей не проникся. Те свойства, которые я хочу видеть получаются просто:
"ВЫБРАТЬ
|	ЗначенияСвойств.Свойство
|ИЗ
|	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
|ГДЕ
|	ЗначенияСвойств.Объект ССЫЛКА Справочник.Склады
|
|СГРУППИРОВАТЬ ПО
|	ЗначенияСвойств.Свойство";
Показать


И вот что теперь с этими данными делать - ума не приложу. Я конечно где то в глубине души (где то очень глубоко) предполагаю, что будет еще запрос (или несколько) с использованием временных таблиц, кучей левых соединений (видимо по количеству различных свойств) и наверно текст запроса будет сформирован программно и т.д. Но пока я до этого не допер. Если не трудно разъясни суть своего алгоритма.
+
7. Трактор 1247 06.12.09 21:02 Сейчас в теме
8. sound 535 07.12.09 08:33 Сейчас в теме
(7) Пишет

Ошибка при выполнении файловой операции 'D:\Downloads\ТранспонированиеСвойств.epf'
по причине:
Неверный формат хранилища данных 'file://D:/Downloads/ТранспонированиеСвойств.epf'

Это часом не 8.2? или 8.0 или чо там еще, у меня просто 8.1 (13.37). Заголовки файлов отличаются..
+
9. Трактор 1247 07.12.09 09:45 Сейчас в теме
(8) 1С:Предприятие 8.1 (8.1.13.41). Писал дома, сейчас на работе, скачал с форума. Всё работает.
Кладёшь на форму табличное поле типа таблица значений. Называешь её тз. В модуль обработки заталкиваешь такой код:
Процедура КнопкаВыполнитьНажатие(Кнопка)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
	               |	ЗначенияСвойств.Свойство
	               |ИЗ
	               |	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
	               |ГДЕ
	               |	ЗначенияСвойств.Объект ССЫЛКА Справочник.Склады";
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	поз = 1;
	ЗапросТранспонированный = Новый Запрос;
	стрЗначенияСвойств = "";
	стрЛевыеСоединения = "";
	Пока Выборка.Следующий() Цикл
		стр = Формат(поз, "ЧГ=0");
		стрЗначенияСвойств = стрЗначенияСвойств + "
							|	Свойства" + стр + ".Значение КАК Свойство" + стр + ",";
		стрЛевыеСоединения = стрЛевыеСоединения + "
							|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК Свойства" + стр + "
	                        |		ПО ЗначенияСвойствОбъектов.Объект = Свойства" + стр + ".Объект
	                        |			И (Свойства" + стр + ".Свойство = &Свойство" + стр + ")";
		ЗапросТранспонированный.УстановитьПараметр("Свойство" + стр, Выборка.Свойство);
		поз = поз + 1;
	КонецЦикла;
	стрЗначенияСвойств = Лев(стрЗначенияСвойств, СтрДлина(стрЗначенияСвойств) - 1); // уберём последнюю зап'ятую. она не нужна.
	ЗапросТранспонированный.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
	                          |	ЗначенияСвойствОбъектов.Объект КАК Товар,
	                          |	" + стрЗначенияСвойств + "
	                          |ИЗ
	                          |	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
	                          |		" + стрЛевыеСоединения + "
	                          |ГДЕ
	                          |	ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Склады";
	РезультатТранспонирования = ЗапросТранспонированный.Выполнить();
	//Выборка = Результат.Выбрать();
	ЭлементыФормы.тз.Значение = РезультатТранспонирования.Выгрузить();
	// транспонированный результат запроса получили. Правда названия полей выборки бессмысленны.
	// Зато порядок совпадает с порядком полей в запросе по свойствам.
	
	// Теперь наводим красоту. Назовём колонки осмысленно.
	Выборка.Сбросить();
	поз = 1;
	Пока Выборка.Следующий() Цикл
		тз.Колонки[поз].Заголовок = Строка(Выборка.Свойство);
		поз = поз + 1;
	КонецЦикла;
	ЭлементыФормы.тз.СоздатьКолонки();
КонецПроцедуры
Показать

и настаёт счастье
+
10. sound 535 07.12.09 10:28 Сейчас в теме
(9) Блин, огромный респект и уважуха! Помогло, я щастлив :)
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот