对某些分组行求和
Sum Over Certain Grouped Rows
我有一个数据集,显示每个类别的消费者(访问过一次、两次、三次、四次、五次等的消费者)的客人数量和收入。
看起来像这样:
我得到上述 table 的查询是:
SELECT number_of_trans, COUNT(*) AS guest_count, SUM(amount) AS revenue
FROM customer_counting
GROUP BY number_of_trans
ORDER BY number_of_trans
现在,我想对 guest_count 和收入求和,我想对以下类别求和:1、2、3、4、5-7 和 8+。
所以实际上 1、2、3 和 4 将保持不变,但我将在第 5 - 7 行和第 8 行及以后的行中求和。
我该怎么做?我要的table如下(不要担心数值的准确性):
希望我的问题得到理解。
使用 case
和子查询(或 CTE):
SELECT (CASE WHEN number_of_trans < 5 THEN CAST(number_of_trans as varchar)
WHEN number_of_trans < 8 THEN '5-7'
ELSE '8+'
END) as grp,
SUM(guest_count) as guest_count, SUM(revenue) as revenue
FROM (SELECT number_of_trans, COUNT(*) AS guest_count, SUM(amount) AS revenue
FROM customer_counting
GROUP BY number_of_trans
) x
GROUP BY grp
ORDER BY MIN(number_of_trans);
戈登提议的更简单形式:
SELECT
CASE WHEN number_of_trans < 5 THEN cast(number_of_trans as varchar)
WHEN number_of_trans < 8 THEN '5-7'
ELSE '8+'
END as freq_band,
COUNT(*) AS guest_count,
SUM(amount) AS revenue
FROM customer_counting
GROUP BY CASE WHEN number_of_trans < 5 THEN cast(number_of_trans as varchar)
WHEN number_of_trans < 8 THEN '5-7'
ELSE '8+'
END
ORDER BY freq_band
我有一个数据集,显示每个类别的消费者(访问过一次、两次、三次、四次、五次等的消费者)的客人数量和收入。
看起来像这样:
我得到上述 table 的查询是:
SELECT number_of_trans, COUNT(*) AS guest_count, SUM(amount) AS revenue
FROM customer_counting
GROUP BY number_of_trans
ORDER BY number_of_trans
现在,我想对 guest_count 和收入求和,我想对以下类别求和:1、2、3、4、5-7 和 8+。
所以实际上 1、2、3 和 4 将保持不变,但我将在第 5 - 7 行和第 8 行及以后的行中求和。
我该怎么做?我要的table如下(不要担心数值的准确性):
希望我的问题得到理解。
使用 case
和子查询(或 CTE):
SELECT (CASE WHEN number_of_trans < 5 THEN CAST(number_of_trans as varchar)
WHEN number_of_trans < 8 THEN '5-7'
ELSE '8+'
END) as grp,
SUM(guest_count) as guest_count, SUM(revenue) as revenue
FROM (SELECT number_of_trans, COUNT(*) AS guest_count, SUM(amount) AS revenue
FROM customer_counting
GROUP BY number_of_trans
) x
GROUP BY grp
ORDER BY MIN(number_of_trans);
戈登提议的更简单形式:
SELECT
CASE WHEN number_of_trans < 5 THEN cast(number_of_trans as varchar)
WHEN number_of_trans < 8 THEN '5-7'
ELSE '8+'
END as freq_band,
COUNT(*) AS guest_count,
SUM(amount) AS revenue
FROM customer_counting
GROUP BY CASE WHEN number_of_trans < 5 THEN cast(number_of_trans as varchar)
WHEN number_of_trans < 8 THEN '5-7'
ELSE '8+'
END
ORDER BY freq_band