#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;