Let’s say I have a table with 3 columns:
Column A: Client_ID (not unique, can appear in multiple rows)
Column B: Price paid for a product
Column C: Product (type)
+---+----+------+---+
| | A | B | C |
+---+----+------+---+
| 1 | 5 | 1200 | 1 |
| 2 | 12 | 10 | 1 |
| 3 | 12 | 15 | 1 |
| 4 | 12 | 1750 | 2 |
| 5 | 12 | 1250 | 2 |
| 6 | 18 | 10 | 1 |
| 7 | 18 | 1500 | 1 |
| 8 | 18 | 1050 | 2 |
| 9 | 18 | 1050 | 2 |
+---+----+------+---+
I want to get 6 columns:
Client_ID | Product | Number_of_transactions | Sum_of_transactions | Number_of_transactions_over_1000 | Sum_of_transactions_over_1000
i.e
| Client_ID | Product | Nb_tr | Sum_tr | Nb_tr_1000 | Sum_tr_1000 |
+-----------+---------+-------+--------+------------+-------------+
| 5 | 1 | 1 | 1200 | 1 | 1200 |
| 5 | 2 | 0 | 0 | 0 | 0 |
| 12 | 1 | 2 | 25 | 0 | 0 |
| 12 | 2 | 2 | 3000 | 2 | 3000 |
| 18 | 1 | 2 | 1510 | 1 | 1500 |
| 18 | 2 | 2 | 2100 | 2 | 2100 |
+-----------+---------+-------+--------+------------+-------------+
With Client_ID x Product unique
I think the first part can be achieved with a simple GROUP BY
(SELECT
SUM(B) as Sum_of_transactions, COUNT(B) as Number_of_transactions
GROUP BY A, C)
However, how can I get Number_of_transactions_over_1000 & Sum_of_transactions_over_1000 also? I know that I can obtain them with a separate query (by adding where B > 1000) and I can left join the query for Number_of_transactions & Sum_of_transactions with the query for Number_of_transactions_over_1000 & Sum_of_transactions_over_1000 afterwards, but can it be done in a single query (with a single SELECT instructions)?
Advertisement
Answer
Note: This will not extrapolate product_type, but gives correct results. Your input data table is named as data_p in following query, change accordingly. Also see if SAS supports CASE WHEN operation.[Because of no live SAS DB with me, i could not check it on SAS but this SQL is generic enough.]
SELECT
clientId,
p_type,
SUM(price) as sum_of_tr,
COUNT(*) as num_of_tr,
SUM(CASE WHEN price>1000 THEN price ELSE 0 END) as sum_of_tr_over_1000,
SUM(CASE WHEN price>1000 THEN 1 ELSE 0 END) as num_of_tr_over_1000
FROM
data_p
GROUP BY
clientId, p_type
ORDER BY
clientId, p_type