Qlik /SQL Server

#sql #qliksense

#sql #qliksense

Вопрос:

Долгое время читал первый постер.

Мне нужна помощь в возврате соответствующего значения при появлении определенного значения.

Например, я хочу вернуть точку A и значение, связанное с этой позицией. В первой строке это будет 1, во второй строке 3 и в третьей строке 1.

  ----------- ----------- 
| Column A  | Column B  |
 ----------- ----------- 
| A;B;C;D;E | 1;2;3;4;5 |
| B;A;C;D;E | 2;3;4;5;1 |
| D;C;E;A;B | 5;2;3;1;4 |
 ----------- ----------- 
  

Комментарии:

1. Не могли бы вы лучше объяснить свой вопрос «соответствующее значение при появлении определенного значения» эта часть неясна.

Ответ №1:

Вы можете использовать функцию подполя для разделения обоих значений столбца. Использование SubField функции (без field_no параметра) создает строку для каждого значения.

Например: если у нас есть A;B;C;D значение as в MyField поле, и мы используем SubField(MyField, ';') . В результате Qlik создаст 4 строки:

 MyField
-------
A
B
C
D
  

Итак, если мы используем SubField оба ColumnA ColumnB поля и (и сохраняем индекс между новыми строками), мы можем создать новую «плоскую» таблицу, содержащую связь между значениями разделения обоих столбцов

Перезагрузка приведенного ниже скрипта приведет к созданию двух таблиц: Data и Flatten . Data являются «необработанными» данными и Flatten являются результатом

Просмотр таблиц

Взгляните на Value и Index столбцы из Flatten таблицы. Они являются результатом использования SubField на ColumnA и ColumnB

Сгладить таблицу

 // Load the sample data
// preceeding load to add ID to each row
Data:
Load
  ColumnA, 
  ColumnB,
  RowNo()  as RowId
;
Load * inline [
ColumnA, ColumnB
A;B;C;D;E, 1;2;3;4;5
B;A;C;D;E, 2;3;4;5;1
D;C;E;A;B, 5;2;3;1;4
];

// Passing RowId across just in case if we want to link back 
// to the Data table
Flatten_Temp:
// Preceding load to add ID (ValueId) for each value in ColumnA
// this ID will be used to join back to the values in ColumnB
Load
  RowId,
  ColumnASplit as Value,
  RowNo()      as ValueId
;
// Using SubField function to create row for each value in ColumnA
Load
  RowId,
  SubField(ColumnA, ';') as ColumnASplit
Resident
  Data
;

JOIN

// Preceding load to add ID (ValueId) for each value in ColumnB
Load
  RowId,
  ColumnBSplit as Index,
  RowNo()      as ValueId
;
// Using SubField function to create row for each value in ColumnB
Load
  RowId,
  SubField(ColumnB, ';') as ColumnBSplit
Resident
  Data
;

NoConcatenate

// Load only 'A' values from the table above
Flatten:
Load
  *
Resident
  Flatten_Temp
Where
  Value = 'A'
;

Drop Table Flatten_Temp;

  

Обновление: Скрипт обновлен, чтобы возвращать только значения для A

Комментарии:

1. привет, Стефан, это не совсем то, на что я надеюсь. Мне нужно только значение, соответствующее A для каждого возвращаемого, а не все остальные значения (B, C, D и т.д.).

2. Обновлен скрипт для загрузки резидента из итоговой таблицы и фильтрации результата только для A