所以我已经有了一个包含用户名和 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 子句并对我如何构建查询有一些见解,我们将不胜感激。
您可以尝试如下所示:
select username, SummedHourCount from #loggedhours cross join
(select sum(SummedHourCount) totalHours from #loggedhours) as t
where (SummedHourCount*1.0/totalHours) > 3.0/4
如果您的目标是检索数据前四分之一的行,我可以建议:
SELECT TOP 25 PERCENT ValueOne, SummedHourCount
FROM (
SELECT ValueOne,
SUM(HourCount) AS SummedHourCount
FROM #loggedhours
GROUP BY ValueOne
) ta
Order by SummedHourCount DESC
在我看来,您正在尝试查找时间超过总时间 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
希望这有帮助。