试图找到一种在SQL Server 2005 / SSRS中将数据拆分成组的优雅方法

时间:2010-11-09 12:06:05

标签: sql-server-2005 tsql

我正在尝试找到将数据分组的最佳方法,例如Quintiles(5组)。我将使用此SQL来恢复SSRS报告的数据。

我目前正在做的是在名为#quintiles的临时表中选择3列(客户ID,客户支出和添加rownumber)。 数据按客户支出排序,从最高到最低。

- 编辑 -

我不太清楚,如果我说清楚,但通过按客户支出订购临时表,当我将其分成小组时,Q1是最高消费者,依此类推,Q5是我的最低消费者。

然后我使用以下case语句将它们分组为5. [tmp]是我的临时表#quintiles的别名,因为这个case部分在第二个SELECT语句中

CASE
WHEN tmp.Row_number <= ((SELECT COUNT (*) FROM #quintiles)/5)
THEN  'Q1'
WHEN tmp.Row_number BETWEEN ((SELECT COUNT (*) FROM #quintiles)/5) AND ((SELECT COUNT (*) FROM #quintiles)*2/5)
THEN 'Q2'
WHEN tmp.Row_number BETWEEN ((SELECT COUNT (*) FROM #quintiles)*2/5) AND ((SELECT COUNT (*) FROM #quintiles)*3/5)
THEN 'Q3'
WHEN tmp.Row_number BETWEEN ((SELECT COUNT (*) FROM #quintiles)*3/5) AND ((SELECT COUNT (*) FROM #quintiles)*4/5)
THEN 'Q4'
WHEN tmp.Row_number > ((SELECT COUNT (*) FROM #quintiles)*4/5)
THEN 'Q5'
END

现在可以使用,并确实将客户分为5组。我不能将总数除以5,好像有一个奇数客户我最终会得到0.5个客户在每个小组中!

我觉得这不是解决这个问题的最好办法。

我希望这是有道理的。

2 个答案:

答案 0 :(得分:2)

您是否在查询中尝试过NTILE(排名函数)? See here 了解详情。

答案 1 :(得分:2)

使用NTILE

SELECT 'Q' + CAST(NTILE(5) OVER (ORDER BY customer_spend) AS VARCHAR(1)) AS Quintile