【问题标题】:SQL Query Return MAX of multiple Counts (Age Groups)SQL 查询返回 MAX 的多个计数(年龄组)
【发布时间】:2022-01-23 07:31:56
【问题描述】:

我正在尝试完成此查询以仅返回记录最多的年龄组:

SELECT 
       COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 18 AND 29 THEN a.Data_Nasc END) AS '18-29',
       COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 30 AND 39 THEN a.Data_Nasc END) AS '30-39',
       COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 40 AND 49 THEN a.Data_Nasc END) AS '40-49',
       COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 50 AND 59 THEN a.Data_Nasc END) AS'50-59',
       COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) > 60 THEN a.Data_Nasc END) AS '>60'
FROM Cliente a
    JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
WHERE b.NIF_Inst <> 999999999

此时查询返回:

18-29 30-39 40-49 50-59  >60
  9     19   11     5     18

记录最多的年龄段是30-39岁,所以想回归的就是那个。

谁能帮忙找出最好的解决方法?

【问题讨论】:

    标签: sql count max


    【解决方案1】:

    您可以使用UNION 合并结果集并选择最顶部的结果

    SELECT top 1 col1, (col) from (
        SELECT '18-29' as col1,  COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 18 AND 29 THEN a.Data_Nasc END) as col         
        FROM Cliente a
        JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
        WHERE b.NIF_Inst <> 999999999
        union all
        SELECT '30-39' as col1, COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 30 AND 39 THEN a.Data_Nasc END) as col
        FROM Cliente a
        JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
        WHERE b.NIF_Inst <> 999999999
        union all
        SELECT '40-49' as col1, COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 40 AND 49 THEN a.Data_Nasc END) as col
        JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
        WHERE b.NIF_Inst <> 999999999
        union all
        SELECT '50-59' as col1, COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 50 AND 59 THEN a.Data_Nasc END) as col    
        FROM Cliente a
        JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
        WHERE b.NIF_Inst <> 999999999
        union all
        SELECT '>60' as col1, COUNT(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) > 60 THEN a.Data_Nasc END) as col
        FROM Cliente a
        JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
        WHERE b.NIF_Inst <> 999999999) as t
    ORDER BY col DESC
        
    

    【讨论】:

    • 首先感谢您的快速帮助。我已经测试了您的解决方案,但它只是给了我最大的记录总数,它没有确定它属于哪个年龄段。我需要获得最大记录以及它属于哪个年龄段。
    【解决方案2】:
    SELECT 
           sum(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 18 AND 29 THEN 1 END) AS '18-29',
           sum(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 30 AND 39 THEN 1 END) AS '30-39',
           sum(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 40 AND 49 THEN 1 END) AS '40-49',
           sum(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) BETWEEN 50 AND 59 THEN 1 END) AS'50-59',
           sum(CASE WHEN DATEDIFF(YEAR, a.Data_Nasc, GETDATE()) > 60 THEN 1 END) AS '>60'
    FROM Cliente a
        JOIN Encomenda b ON b.NIF_Cliente = a.NIF_Cliente
    WHERE b.NIF_Inst <> 999999999
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多