【问题标题】:Calculate and create categories age display sum by column按列计算和创建类别年龄显示总和
【发布时间】:2014-10-22 15:10:37
【问题描述】:

这是我的查询。 我计算年龄,在我对每个类别的发生率求和之后,一切都正确。

SELECT
        SUM(CASE WHEN AGE <18 THEN 1 ELSE 0 END) AS '<18', 
        SUM(CASE WHEN AGE >= 18 AND AGE <= 24 THEN 1 ELSE 0 END) AS '18-24', 
        SUM(CASE WHEN AGE >= 25 AND AGE <= 34 THEN 1 ELSE 0 END) AS '25-34',
        SUM(CASE WHEN AGE >= 35 AND AGE <= 44 THEN 1 ELSE 0 END) AS '35-44', 
        SUM(CASE WHEN AGE >= 45 AND AGE <= 54 THEN 1 ELSE 0 END) AS '45-54', 
        SUM(CASE WHEN AGE >= 55 THEN 1 ELSE 0 END)AS '>=55'
    FROM (SELECT t_personne.pers_date_naissance, t_personne.pers_date_inscription, 
            TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) - 
            CASE WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
            OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
            AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
            THEN 1 ELSE 0 END AS AGE
            FROM t_personne) AS Total

给:

<18|18-24|25-34|35-44|45-54|>=55    
67 |693  |1619 |1486 |616  |93

但我想要这个:

AGE  |Total|
<18  |67   |
18-24|693  |
25-34|1619 |
35-44|1486 |
45-54|616  |
>=55 |93   |

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: mysql sum case multiple-columns


【解决方案1】:

您可以使用带有列名的交叉连接来转置它

SELECT 
    age_range,
    CASE age_range 
        WHEN '<18' THEN SUM(CASE WHEN AGE <18 THEN 1 ELSE 0 END)
        WHEN '18-24' THEN SUM(CASE WHEN AGE >= 18 AND AGE <= 24 THEN 1 ELSE 0 END)
        WHEN '25-34' THEN SUM(CASE WHEN AGE >= 25 AND AGE <= 34 THEN 1 ELSE 0 END)
        WHEN '35-44' THEN SUM(CASE WHEN AGE >= 35 AND AGE <= 44 THEN 1 ELSE 0 END)
        WHEN '45-54' THEN SUM(CASE WHEN AGE >= 45 AND AGE <= 54 THEN 1 ELSE 0 END)
        WHEN '>=55' THEN SUM(CASE WHEN AGE >= 55 THEN 1 ELSE 0 END)
    END value
FROM 
(   SELECT 
        t_personne.pers_date_naissance, 
        t_personne.pers_date_inscription, 
        TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) 
        - CASE 
            WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
             OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
             AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
            THEN 1 ELSE 0 
          END AS AGE
    FROM t_personne
) AS Total
CROSS JOIN
(   SELECT '<18' age_range UNION ALL
    SELECT '18-24' UNION ALL
    SELECT '25-34' UNION ALL
    SELECT '35-44' UNION ALL
    SELECT '45-54' UNION ALL
    SELECT '>=55'
)a
GROUP BY age_range
ORDER BY FIELD(age_range, '<18', '18-24', '25-34', '35-44', '45-54', '>=55')

FIDDLE DEMO

【讨论】:

  • 它有效。非常感谢约翰支持我的问题。如果他有其他方法,我很感兴趣。 :)
  • @leerickx 谢谢,如果它解决了您的问题,您可以将其标记为已接受吗?我会非常感激
【解决方案2】:

不那么优雅,但它会工作

SELECT
    '<18' as AGE,COUNT(AGE) AS Total FROM
    (SELECT t_personne.pers_date_naissance, t_personne.pers_date_inscription, 
        TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) - 
        CASE WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
        OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
        AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
        THEN 1 ELSE 0 END AS AGE
        FROM t_personne) as Totals where AGE <18
UNION
 SELECT
    '18-24',COUNT(AGE) AS Total FROM
    (SELECT t_personne.pers_date_naissance, t_personne.pers_date_inscription, 
        TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) - 
        CASE WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
        OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
        AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
        THEN 1 ELSE 0 END AS AGE
        FROM t_personne) as Totals where AGE >= 18 AND AGE <= 24 
 UNION
 SELECT
    '25-34',COUNT(AGE) AS Total FROM
    (SELECT t_personne.pers_date_naissance, t_personne.pers_date_inscription, 
        TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) - 
        CASE WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
        OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
        AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
        THEN 1 ELSE 0 END AS AGE
        FROM t_personne) as Totals where AGE >= 25 AND AGE <= 34 
UNION
 SELECT
    '35-44',COUNT(AGE) AS Total FROM
    (SELECT t_personne.pers_date_naissance, t_personne.pers_date_inscription, 
        TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) - 
        CASE WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
        OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
        AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
        THEN 1 ELSE 0 END AS AGE
        FROM t_personne) as Totals where AGE >= 35 AND AGE <= 44
UNION
 SELECT
    '45-54',COUNT(AGE) AS Total FROM
    (SELECT t_personne.pers_date_naissance, t_personne.pers_date_inscription, 
        TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) - 
        CASE WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
        OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
        AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
        THEN 1 ELSE 0 END AS AGE
        FROM t_personne) as Totals where AGE >= 45 AND AGE <= 54
UNION
 SELECT
    '>=55',COUNT(AGE) AS Total FROM
    (SELECT t_personne.pers_date_naissance, t_personne.pers_date_inscription, 
        TIMESTAMPDIFF(Year, t_personne.pers_date_naissance, t_personne.pers_date_inscription) - 
        CASE WHEN MONTH(t_personne.pers_date_naissance) > MONTH(t_personne.pers_date_inscription) 
        OR (MONTH(t_personne.pers_date_naissance) = MONTH(t_personne.pers_date_inscription) 
        AND DAY(t_personne.pers_date_naissance) > DAY(t_personne.pers_date_inscription))
        THEN 1 ELSE 0 END AS AGE
        FROM t_personne) as Totals where AGE >= 55

【讨论】:

  • 稍微重新排列一下,我认为您只需要执行一次该子查询。
  • 差不多 :) 我们不能做得更轻吗?我会发布一个sqlfiddle。 =55 5946
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2022-12-09
相关资源
最近更新 更多