【问题标题】:SQL Server calculating percentage when using cross apply使用交叉应用时 SQL Server 计算百分比
【发布时间】:2021-03-28 15:54:13
【问题描述】:

使用下面的查询,我试图获取有多少用户属于哪个年龄段,为此我应用了交叉应用。

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 .. 在这种情况下我如何获得百分比?

【问题讨论】:

    标签: sql sql-server count percentage lateral-join


    【解决方案1】:

    使用窗口函数:

    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(*)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2020-11-30
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多