Преобразование данных в столбцах в строки — Загрузка Qlikview

#qlikview #qliksense

Вопрос:

У меня есть таблица, подобная приведенной ниже, в листе Excel:

Человек Еда Пить Закуска
A Сандвичи Вода Чипсы
B Заворачивать Кола Чипсы
C Макароны Кола Чипсы
D Сандвичи Сок Банан
E Бутерброд Кола Чипсы

Я хочу преобразовать его в приведенную ниже таблицу при загрузке данных в qlikview

Человек Предмет
A Сандвичи
A Вода
A Чипсы
B Заворачивать
B Кола
B Чипсы
C Макароны
C Кола
C Чипсы
D Сандвичи
D Сок
D Банан
E Бутерброд
E Кола
E Чипсы

Есть ли способ достичь этого?

Ответ №1:

По-другому было бы с перекрестной таблицей.

 Data:
load * inline [
Person, Food,   Drink,  Snack
A,  Sandwich,   Water,  Crisps
B,  Wrap,   Coke,   Crisps
C,  Pasta,  Coke,   Crisps
D,  Sandwich,   Juice,  Banana
E,  Burger, Coke,   Crisps];

NEW_Table:
crosstable(Name,Item,1)
load * resident Data;

drop table Data;
drop field Name;
 

Ответ №2:

Вероятно, самый ленивый способ-это перебрать все поля и объединить их.

Приведенный ниже аннотированный сценарий приведет к следующему результату: Представление данных

 RawData:
LOAD 
    Person, 
    Food, 
    Drink, 
    Snack
FROM
    [C:UsersUserDocumentsdata.xlsx]
    (ooxml, embedded labels, table is Sheet1)
;

// loop through all the fields in RawData table
for i = 1 to NoOfFields('RawData')
    // get the name of the field in the current iteration
    let fieldName = FieldName($(i), 'RawData');
    
    // field "Person" should not be included    
    if('$(fieldName)' <> 'Person') then
        // resident load from RawData table the Person field
        // and the field name from the current iteration
        // name the new field "Item"
        // because the table in each iteration is having the same 
        // name and the same fields Qlik will concatenate the result
        // to an existing table
        Result:
        Load
            Person,
            [$(fieldName)] as Item 
        Resident
            RawData
        ;
    
    end if

next

// if RawData table is not needed anymore
Drop Table RawData;