代码之家  ›  专栏  ›  技术社区  ›  Wes Price

尝试在SQL Server 2005/SSR中找到一种优雅的方法将数据分组

  •  1
  • Wes Price  · 技术社区  · 14 年前

    我正在尝试找到将数据分组的最佳方法,例如五分位数(5个分组)。我将使用此SQL为SSRS报告返回数据。

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

    -编辑-

    不太确定我是否清楚,但通过按客户支出订购临时表,当我将其分解为组时,Q1是最高的支出者,依此类推,Q5是我的最低支出者。

    然后我使用下面的case语句将它们分组为5个。[tmp]是我的临时表五分位数的别名,因为本例部分在第二个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 回复  |  直到 12 年前
        1
  •  2
  •   Vertism    14 年前

    SELECT 'Q' + CAST(NTILE(5) OVER (ORDER BY customer_spend) AS VARCHAR(1)) AS Quintile
    
        2
  •  2
  •   Damir Sudarevic    14 年前
    推荐文章