简体   繁体   English

SQL 使用交叉应用时服务器计算百分比

[英]SQL Server calculating percentage when using cross apply

Using below query i am trying to get how many users are falling under which age group, for this i applied 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

Now besides [TotalUsers] i want to have another column [Percentage] which should give me the Percentage of that row across entire column.现在除了 [TotalUsers] 我还想有另一列 [Percentage] 应该给我该行在整个列中的百分比。

I tried using 100 * COUNT(U.[UserId]) / SUM(U.[UserId]) but i see an erros stating UserId is not present in the select clause.. how do i get the percentage in this case?我尝试使用 100 * COUNT(U.[UserId]) / SUM(U.[UserId]) 但我看到一个错误,指出 select 子句中不存在 UserId .. 在这种情况下我如何获得百分比?

Use window functions:使用 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

Note: presumaby u.[UserId] is never NULL , so COUNT(u.[UserId]) can be simplified as COUNT(*) .注意:假设u.[UserId]永远不会是NULL ,因此COUNT(u.[UserId])可以简化为COUNT(*)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM