SQL 服务器在使用交叉应用时计算百分比
SQL Server calculating percentage when using cross apply
使用下面的查询,我试图了解有多少用户属于哪个年龄段,为此我应用了交叉应用。
SELECT y.AgeDecade, COUNT(u.[UserId]) AS [TotalUsers]
FROM dbo.[User] u
CROSS APPLY (SELECT Age = (CONVERT(int, CONVERT(char(8), GETDATE(), 112)) - CONVERT(int, CONVERT(char(8), u.DateOfBirth, 112))) / 10000) x
CROSS APPLY (SELECT AgeDecade = CASE
WHEN x.Age <= 29 THEN 20
WHEN x.Age BETWEEN 30 AND 39 THEN 30
WHEN x.Age BETWEEN 40 AND 49 THEN 40
WHEN x.Age >= 50 THEN 50
ELSE NULL
END
) y
GROUP BY y.AgeDecade
现在除了 [TotalUsers] 之外,我还想有另一列 [Percentage],它应该给我该行在整个列中的百分比。
我尝试使用 100 * COUNT(U.[UserId]) / SUM(U.[UserId]) 但我看到一个错误,指出 UserId 不存在于 select 子句中。我该怎么做在这种情况下得到百分比 ?
使用window函数:
SELECT y.AgeDecade, COUNT(*) AS [TotalUsers],
100.0 * COUNT(*) / SUM(COUNT(*)) OVER() as [Percent]
FROM dbo.[User] u
CROSS APPLY (SELECT Age = (CONVERT(int, CONVERT(char(8), GETDATE(), 112)) - CONVERT(int, CONVERT(char(8), u.DateOfBirth, 112))) / 10000) x
CROSS APPLY (SELECT AgeDecade = CASE
WHEN x.Age <= 29 THEN 20
WHEN x.Age BETWEEN 30 AND 39 THEN 30
WHEN x.Age BETWEEN 40 AND 49 THEN 40
WHEN x.Age >= 50 THEN 50
ELSE NULL
END
) y
GROUP BY y.AgeDecade
注意:推测 u.[UserId]
永远不会是 NULL
,所以 COUNT(u.[UserId])
可以简化为 COUNT(*)
.
使用下面的查询,我试图了解有多少用户属于哪个年龄段,为此我应用了交叉应用。
SELECT y.AgeDecade, COUNT(u.[UserId]) AS [TotalUsers]
FROM dbo.[User] u
CROSS APPLY (SELECT Age = (CONVERT(int, CONVERT(char(8), GETDATE(), 112)) - CONVERT(int, CONVERT(char(8), u.DateOfBirth, 112))) / 10000) x
CROSS APPLY (SELECT AgeDecade = CASE
WHEN x.Age <= 29 THEN 20
WHEN x.Age BETWEEN 30 AND 39 THEN 30
WHEN x.Age BETWEEN 40 AND 49 THEN 40
WHEN x.Age >= 50 THEN 50
ELSE NULL
END
) y
GROUP BY y.AgeDecade
现在除了 [TotalUsers] 之外,我还想有另一列 [Percentage],它应该给我该行在整个列中的百分比。
我尝试使用 100 * COUNT(U.[UserId]) / SUM(U.[UserId]) 但我看到一个错误,指出 UserId 不存在于 select 子句中。我该怎么做在这种情况下得到百分比 ?
使用window函数:
SELECT y.AgeDecade, COUNT(*) AS [TotalUsers],
100.0 * COUNT(*) / SUM(COUNT(*)) OVER() as [Percent]
FROM dbo.[User] u
CROSS APPLY (SELECT Age = (CONVERT(int, CONVERT(char(8), GETDATE(), 112)) - CONVERT(int, CONVERT(char(8), u.DateOfBirth, 112))) / 10000) x
CROSS APPLY (SELECT AgeDecade = CASE
WHEN x.Age <= 29 THEN 20
WHEN x.Age BETWEEN 30 AND 39 THEN 30
WHEN x.Age BETWEEN 40 AND 49 THEN 40
WHEN x.Age >= 50 THEN 50
ELSE NULL
END
) y
GROUP BY y.AgeDecade
注意:推测 u.[UserId]
永远不会是 NULL
,所以 COUNT(u.[UserId])
可以简化为 COUNT(*)
.