按具有起点和终点 SQL Server 的动态间隔分组
Posted
技术标签:
【中文标题】按具有起点和终点 SQL Server 的动态间隔分组【英文标题】:group by dynamic interval with starting and ending point SQL Server 【发布时间】:2020-08-05 18:21:54 【问题描述】:我有一个表,其中包含一个列 DED
,其中的数字可以从 0 到无穷大。我有兴趣将它们从 0 开始分组(上限为开区间,下限为闭区间)并获得百分比总计
假设我有一列
DED AMT
0.0004 4
0.0009 1
0.001 2
0.002 1
0.009 4
0.01 5
0.04 6
0.09 3
0.095 1
0.9 3
1 2
100 1
500 1
所以我想要以下间隔:
DED AMT PAMT
0-0.01 12 0.3529
0.01-0.02 5 0.1470
0.04-0.05 6 0.1764
0.09-0.1 4 0.1176
0.9-1 3 0.0882
1 2 0.0588
我试过了:
SELECT CAST(DED/.02*.02 AS VARCHAR) +' - '+CAST(DED/.02*.02 +.01 AS VARCHAR) AS DED,
SUM(AMT) AS AMT,ISNULL(SUM(AMT)*1.000/NULLIF(SUM(SUM(AMT)) OVER (),0),0) AS PAMT
FROM MYTABLE
WHERE DED/.02*.02<=1
GROUP BY DED/.02*.02
感谢您的帮助
【问题讨论】:
你是说你想要那些特定的硬编码范围吗?或者是否有一些公式或算法来定义范围? 【参考方案1】:SELECT
ROUND(DED, 2, 1) AS DED_lower,
ROUND(DED, 2, 1) + 0.01 AS DED_upper,
SUM(AMT) AS SUM_AMT,
SUM(AMT) * 1.0
/
SUM(AMT) OVER () AS PAMT
FROM
mytable
WHERE
DED <= 1
GROUP BY
ROUND(DED, 2, 1)
ROUND(DED, 2, 1)
将向下舍入到小数点后两位。给出大小为 0.01 的相同大小的带。
抱歉输入错误或格式错误,我正在打电话
【讨论】:
谢谢!我已经尝试过 round() 的东西,但我没有在第三个参数中包含“1”,所以它没有按我的意愿工作。我查了一下,它说它会将结果截断为小数位数......你知道它到底是做什么的吗? @janf 就像我说的,四舍五入。从 0.00 到 0.00999999999999999999999999999999 的任何值都向下舍入为 0.00,然后从 0.01 到 0.019999999999999999999999999999999 的任何值向下舍入为 0.01,依此类推 没有第三个参数的四舍五入到最接近的值。所以 0.0049 到 0.00 和 0.0050 到 0.01以上是关于按具有起点和终点 SQL Server 的动态间隔分组的主要内容,如果未能解决你的问题,请参考以下文章