如何将 HAVING 子句与 SUM() 函数一起使用

问题描述 投票:0回答:3

所以我已经有了一个包含用户名和 SummedHourCount 列的表。我的目标是选择用户名,其中 (

SummedHourCount / SUM(SummedHourCount)) > 3/4
SUM(SummedHourCount)
表示该列中存在的所有时间。

例如,如果我有以下数据:

Username, SummedHourCount
randy.jackson, 13
jaren.neilson, 1
jerome.nettles, 2
billy.bobjr, 1

我希望查询仅选择

randy.jackson, 13

我遇到困难的部分是实施 HAVING 子句。我不是非常熟悉,但每次尝试都会由于语法错误而失败,或者根本无法按预期工作并返回所有结果。这就是我目前拥有的:

SELECT  ValueOne, 
        SummedHourCount 
FROM
(
    SELECT  ValueOne, 
            SUM(HourCount) AS SummedHourCount 
    FROM    #loggedhours 
    GROUP BY ValueOne
) ta
GROUP BY ValueOne, SummedHourCount
HAVING (SummedHourCount / SUM(SummedHourCount)) > 3/4

它除了返回所有结果之外什么也不做,但至少不会抛出任何语法错误。如果有人更了解 HAVING 子句并对我如何构建查询有一些见解,我们将不胜感激。

sql sql-server aggregate-functions having
3个回答
0
投票

您可以尝试如下所示:

select username, SummedHourCount from #loggedhours cross join
(select sum(SummedHourCount) totalHours from #loggedhours) as t
where (SummedHourCount*1.0/totalHours) > 3.0/4

0
投票

如果您的目标是检索数据前四分之一的行,我可以建议:

SELECT TOP 25 PERCENT ValueOne, SummedHourCount
FROM (
    SELECT  ValueOne, 
            SUM(HourCount) AS SummedHourCount 
    FROM    #loggedhours 
    GROUP BY ValueOne
) ta
Order by SummedHourCount DESC

0
投票

在我看来,您正在尝试查找时间超过总时间 3/4 (75%) 的用户。那是对的吗?如果是这样,那么以下内容可能对您有用(它使用聚合和窗口函数,但不使用

HAVING
):

SELECT ValueOne, SummedHourCount FROM (
    SELECT ValueOne, SummedHourCount
         , SUM(SummedHourCount) OVER () AS TotalHourCount
      FROM (
        SELECT ValueOne, SUM(HourCount) AS SummedHourCount 
          FROM #loggedhours 
         GROUP BY ValueOne
    )
) WHERE SummedHourCount / TotalHourCount > 3/4

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.