0 Votes

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С)

Last modified by Сергей Коршунов on 2022/04/21 17:56

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С)

 

PIVOT Транспонирование

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

Достаточно часто возникает задача транспонирования какой-нибудь таблицы, то есть превращения конкретных строк таблицы в отдельные столбцы. Рассмотрим как решается эта задача на простом примере.

Допустим, в справочнике номенклатуры у нас есть табличная часть "Справочник.Номенклатура.Свойства", в которой собраны свойства и их значения, ниже представлено её содержимое:

СсылкаСвойствоЗначение
Монитор BENQ GW2480 23.8"Размер диагонали (дюймы)23,8
Монитор BENQ GW2480 23.8"Разрешение1920x1080
Монитор BENQ GW2480 23.8"Тип матрицыIPS
Монитор IIYAMA ProLite XB2483HSU-B3 23.8"Размер диагонали (дюймы)23,8
Монитор IIYAMA ProLite XB2483HSU-B3 23.8"Разрешение1920x1080
Монитор IIYAMA ProLite XB2483HSU-B3 23.8"Тип матрицыVA
Монитор SAMSUNG U28E590D "R", 28"Размер диагонали (дюймы)28,0
Монитор SAMSUNG U28E590D "R", 28"Разрешение3840x2160
Монитор SAMSUNG U28E590D "R", 28"Тип матрицыTN

Нужно каждое свойство определённого вида записать в собственную отдельную колонку, то есть получить таблицу вот такого вида:

СсылкаРазмерДиагоналиРазрешениеТипМатрицы
Монитор BENQ GW2480 23.8"23,81920x1080IPS
Монитор IIYAMA ProLite XB2483HSU-B3 23.8"23,81920x1080VA
Монитор SAMSUNG U28E590D "R", 28"28,03840x2160TN

Этого можно достигнуть при помощи комбинации операции группировки, агрегатной функции "МАКСИМУМ" и  оператора "ВЫБОР". Ниже приведён пример запроса, который выполняет транспонирование нашей исходной таблицы "Справочник.Номенклатура.Свойства":

ВЫБРАТЬ
 НоменклатураСвойства.Ссылка КАК Ссылка,
 
 МАКСИМУМ(
   ВЫБОР
    КОГДА НоменклатураСвойства.Свойство = &РазмерДиагонали
     ТОГДА НоменклатураСвойства.Значение
    ИНАЧЕ NULL
   КОНЕЦ
  ) КАК РазмерДиагонали,

 МАКСИМУМ(
   ВЫБОР
    КОГДА НоменклатураСвойства.Свойство = &Разрешение
     ТОГДА НоменклатураСвойства.Значение
    ИНАЧЕ NULL
   КОНЕЦ
  ) КАК Разрешение,

 МАКСИМУМ(
   ВЫБОР
    КОГДА НоменклатураСвойства.Свойство = &ТипМатрицы
     ТОГДА НоменклатураСвойства.Значение
    ИНАЧЕ NULL
   КОНЕЦ
  ) КАК ТипМатрицы

ИЗ Справочник.Номенклатура.Свойства КАК НоменклатураСвойства
ГДЕ 
 НоменклатураСвойства.Свойство В
 (
  &РазмерДиагонали,
  &Разрешение,
  &ТипМатрицы
 )

СГРУППИРОВАТЬ ПО
 НоменклатураСвойства.Ссылка