This should be easy, but I’m having trouble with it.
I have a results
table that looks like this:
store_id cust_id spend_ind pct 200 2 A 0.33 200 2 B 0.33 200 3 A 0.33 300 1 A 0.50 300 100 B 0.50 400 2 A 0.33 400 2 B 0.33 400 5 B 0.33
Notice that the pct
column sums to 1.0 for each store.
Here’s the code to create this table:
CREATE TABLE results( store_id int, cust_id int, spend_ind char, pct float ); INSERT INTO results VALUES(200,2,'A',0.33); INSERT INTO results VALUES(200,2,'B',0.33); INSERT INTO results VALUES(200,3,'A',0.33); INSERT INTO results VALUES(300,1,'A',0.50); INSERT INTO results VALUES(300,100,'B',0.50); INSERT INTO results VALUES(400,2,'A',0.33); INSERT INTO results VALUES(400,2,'B',0.33); INSERT INTO results VALUES(400,5,'B',0.33);
I’m trying to group the results by store, then by cust_id while creating a new category A&B
if the same cust_id has both A
and B
spend indicators for a specific store. Here’s what I’m trying to output:
store_id spend_ind pct 200 A&B 0.66 200 A 0.33 300 A 0.50 300 B 0.50 400 A&B 0.66 400 B 0.33
For example, customer 2 has spending patterns A
and B
for store 200, so we create a new category A&B
that sums the pct
column for any customer with spending patterns A
and B
.
Advertisement
Answer
I would phrase this as:
select store_id, cust_id, group_concat(spend_ind order by spend_ind separator '&') spend_ind, sum(pct) pct from results group by store_id, cust_id
You possibly want another level of aggregation to group customers by their new category:
select store_id, spend_ind, sum(pct) pct from ( select store_id, cust_id, group_concat(spend_ind order by spend_ind separator '&') spend_ind, sum(pct) pct from results group by store_id, cust_id ) t group by store_id, spend_ind
store_id | spend_ind | pct -------: | :-------- | ---: 200 | A&B | 0.66 200 | A | 0.33 300 | A | 0.50 300 | B | 0.50 400 | A&B | 0.66 400 | B | 0.33