如何使用具有SUM()函数的HAVING子句

时间:2018-03-26 22:55:20

标签: sql sql-server aggregate-functions having

所以我已经找到了一个包含Username和SummedHourCount列的表。我的目标是选择用户名(SummedHourCount / SUM(SummedHourCount)) > 3/4SUM(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条款更了解并且对如何构建查询有一些见解,那将非常感激。

3 个答案:

答案 0 :(得分:0)

您可以尝试以下内容:

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

答案 1 :(得分:0)

如果你的目标是检索数据前四分位数中的行,我可以建议:

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

答案 2 :(得分: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

希望这有帮助。