我需要返回记录的基础上,他们的“总百分比”是什么。例如,我可能想知道“按客户划分的前10%销售额”。
目前,我正在使用:
SELECT * FROM (SELECT Dim1, SUM(SQ_Fact1) AS Fact1,
(SUM(SUM(SQ_Fact1)) OVER(ORDER BY SUM(SQ_Fact1) DESC))/SUM(SUM(SQ_Fact1)) OVER() AS PctOfTtl
FROM (SELECT Customer AS Dim1, SUM(Sales) AS SQ_Fact1
FROM SalesHistory GROUP BY Customer) AS sq
GROUP BY Dim1) AS mq
WHERE PctOfTtl<=0.10
这有点过于复杂,但它是查询构建ui的一部分,因此它为所有查询创建一个子查询和“main”外部查询(出于与此无关的原因),然后它必须在这些查询周围使用另一个外部查询来检查pctofttl。不管怎样,获取累计百分比的行(并按降序排序,这样我就可以得到“前”个记录)是:
(SUM(SUM(SQ_Fact1)) OVER(ORDER BY SUM(SQ_Fact1) DESC))/SUM(SUM(SQ_Fact1)) OVER() AS PctOfTtl
然后在外部查询中,我通过说“where pctofttl<=0.10”来限制返回的总百分比
问题是,pctoftl告诉我他们占总数的百分比在哪里结束,而不是从哪里开始。
所以,假设最大的客户占销售额的15%。它的pctofttl为0.15。问题是,如果用户询问销售额前10%的客户(<=0.1),它将不返回任何记录,因为排名靠前的客户直到0.15才“结束”,所以他们的pctofttl不会<=0.1。我需要知道的是他们占总客户的百分比(即,排名第一的客户从0开始,第二的客户从0.15开始,以此类推)。我真正要寻找的是那些总“范围”的百分比在用户指定的百分比范围内的任何客户(即使它超出了它)。
问题是,就像我说的,这是一个查询构建ui,所以我不能完全重构查询来实现这一点。它必须在现有的“subquery/main query”格式的范围内工作,而使用“over”子句是这样做的。我可以检查他们是否使用了“top%”过滤器,如果是这样,就在pctoftl列上添加一个限制pctoftl的外部查询来包围查询。基本上,我希望找到一种使用over()的方法,它能告诉我pctofttl减去pctofttl“之前”的值。
1条答案
按热度按时间gwo2fgha1#
尝试减去当前值: