Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Talend Cloud AWS EU Scheduled Outage: Starting Tues 26 May 21:00 CEST with expected completion Wed 27 May 01:00 CEST
cancel
Showing results for 
Search instead for 
Did you mean: 
mcorser
Contributor II
Contributor II

Consolidating multiple sales records into a single line in a table

I have a sales dataset with columns CustomerID, ProductCode, and SalesDate. Each line has a different combination of these variables.

Each ProductCode can be categorized into one of two groups. Let's call them Group A and Group B.

I want to organize a new table with four columns: CustomerID, isGroupA, isGroupB, and isBoth.

Each line should be associated with a unique CustomerID, with counts of total purchases of Group A products in isGroupA, a count of total purchases of Group B products in isGroupB, and, if the values of isGroupA and isGroupB are both greater than zero, a boolean value of 1 in isBoth.

So far, we have tried using the Distinct keyword in association with the CustomerID column, using the variables as dimensions (rather than measures), as well as a number of more complicated recommendations for similar puzzles found on the Qlik community boards.

Current Table:

CustomerID ProductCode SalesDate
1 x 2020
1 x 2021
1 y 2022
1 x 2022
2 x 2019
2 p 2021
2 y 2022
3 q 2005
3 q 2021
3 p 2022
4 y 2021
4 p 2021

 

Group A: [x,y]

Group B: [p,q]

Desired Table:

CustomerID isGroupA isGroupB isBoth
1 4 0 0
2 2 1 1
3 0 3 0
4 1 1 1

 

How do I count and consolidate the multiple sales records for each customer into one row?

Labels (1)
2 Replies
RsQK
Creator II
Creator II

Hi, one way would be like this:

data:
LOAD *,
CustomerID	& '|' & SalesDate as cust_date.#key,
ProductCode	& '|' & SalesDate as counter
INLINE [
CustomerID|ProductCode|SalesDate
1|x|2020
1|x|2021
1|y|2022
1|x|2022
2|x|2019
2|p|2021
2|y|2022
3|q|2005
3|q|2021
3|p|2022
4|y|2021
4|p|2021
] (DELIMITER IS '|');

temp_calc:
LOAD
CustomerID,
[cust_date.#key],
ProductCode,
counter
RESIDENT data;

LEFT JOIN (temp_calc)
LOAD * INLINE [
ProductCode|GroupCode
x|A
y|A
p|B
q|B
] (DELIMITER IS '|');

temp_calc2:
LOAD
CustomerID,
GroupCode,
COUNT(DISTINCT counter) AS count_of_counter
RESIDENT temp_calc
GROUP BY CustomerID,GroupCode;

DROP TABLE temp_calc;

temp_conc:
LOAD DISTINCT
CustomerID
RESIDENT temp_calc2;

JOIN (temp_conc)
LOAD
SUBFIELD('A|B','|') AS GroupCode
AUTOGENERATE 1;

CONCATENATE (temp_calc2)
LOAD *,
0 AS count_of_counter
RESIDENT temp_conc;

DROP TABLE temp_conc;

temp_final:
LOAD DISTINCT
CustomerID
RESIDENT temp_calc2;

LEFT JOIN (temp_final)
LOAD
CustomerID,
RANGESUM(SUM(count_of_counter),0) AS isGroupA
RESIDENT temp_calc2
WHERE MATCH(GroupCode,'A')
GROUP BY CustomerID;

LEFT JOIN (temp_final)
LOAD
CustomerID,
RANGESUM(SUM(count_of_counter),0) AS isGroupB
RESIDENT temp_calc2
WHERE MATCH(GroupCode,'B')
GROUP BY CustomerID;

DROP TABLE temp_calc2;

final:
LOAD *,
PICK(MATCH(RANGESUM(isGroupA*isGroupB,0),0)+1,1,0) AS isBoth
RESIDENT temp_final;

DROP TABLE temp_final;

DROP FIELDS counter,[cust_date.#key];
vinieme12
Champion III
Champion III

As below

temp:
load *,recno() as rowID inline [ 
CustomerID,ProductCode,SalesDate
1,x,2020
1,x,2021
1,y,2022
1,x,2022
2,x,2019
2,p,2021
2,y,2022
3,q,2005
3,q,2021
3,p,2022
4,y,2021
4,p,2021
];

Summary:
Load 
*,
if(GroupA>0 and GroupB>0,1,0) as isBoth
;
Load CustomerID
,count(if(WildMatch(ProductCode,'x','y'),1)) as GroupA
,count(if(WildMatch(ProductCode,'p','q'),1)) as GroupB
Resident temp
Group by CustomerID;

exit Script;

Capture.PNG

 

 

Vineeth Pujari
If a post helps to resolve your issue, please accept it as a Solution.