对年龄范围进行分类并在一列中显示

Tes*_*est 4 sql-server-2008 sql-server

我想看数据如下

Member   Age  Category
Test1    25    Under 30
Test2    55    51-60
Test3    67    Above 60
Run Code Online (Sandbox Code Playgroud)

我使用了以下查询(来自我上一个问题的答案)根据出生日期和当前日期计算年龄,然后将每个年龄归类到一个名称下。

此查询正在创建单独的列,而不是我想查看一列下的所有类别,以便我可以对该类别列进行分组

WITH AgeData as
(
SELECT
    Username,
    Birthdate,
    DATEDIFF(YEAR, birthdate, GETDATE()) AS AGE
FROM @Table)
SELECT
    Username,
    Birthdate,
    Age,
    CASE
        WHEN AGE < 30 THEN 1
        ELSE 0
    END AS 'Under 30',
    CASE
        WHEN AGE BETWEEN 31 AND 40 THEN 1
        ELSE 0
    END AS '31 - 40',
    CASE
        WHEN AGE BETWEEN 41 AND 50 THEN 1
        ELSE 0
    END AS '41 - 50',
    CASE
        WHEN AGE > 50 THEN 1
        ELSE 0
    END AS 'Over 50'
FROM AgeData
Run Code Online (Sandbox Code Playgroud)

Ken*_*son 8

不是使用多个CASE表达式,每个组一个,只需将它们组合成一个表达式。然后,在THEN子句中,您可以使用更具描述性的内容稍后进行分组。在下面的示例中,我使用了您提供的列别名。

WITH AgeData as
(
  SELECT [Username],
         [Birthdate],
         DATEDIFF(YEAR, [Birthdate], GETDATE()) AS [AGE]
  FROM @table
),
GroupAge AS
(
  SELECT [Username],
         [Birthdate],
         [Age],
         CASE
             WHEN AGE < 30 THEN 'Under 30'
             WHEN AGE BETWEEN 31 AND 40 THEN '31 - 40'
             WHEN AGE BETWEEN 41 AND 50 THEN '41 - 50'
             WHEN AGE > 50 THEN 'Over 50'
             ELSE 'Invalid Birthdate'
         END AS [Age Groups]
  FROM AgeData
)
SELECT COUNT(*) AS [AgeGrpCount],
       [Age Groups]
FROM GroupAge
GROUP BY [Age Groups];
Run Code Online (Sandbox Code Playgroud)