代码之家  ›  专栏  ›  技术社区  ›  enkiki

带有count查询和添加另一列的MySQL案例

  •  0
  • enkiki  · 技术社区  · 7 年前

    我正在尝试将列(客户端)添加到我的以下MySQL查询中:

    我的桌子

    CLIENT  SEVERITYLEVEL TOTAL
      Bob        4        27
      Bob        3        24
      Bob        7        19
      Bob        5        10
      Bob        8        9
      Bob        6        7
      Bob        1        5
      Bob        2        3
      Gin        2        6
      Gin        3        7
    

    我想要的输出

    CLIENT SEVERITYLEVEL  Total
    
    Bob    Severe         63
    Bob    Moderate       32
    Bob    Critical       9
    

    select 
    (case when (`s2`.`SEVERITYLEVEL` = 1) then 'Moderate' 
     when (`s2`.`SEVERITYLEVEL` = 2) then 'Moderate' 
     when (`s2`.`SEVERITYLEVEL` = 3) then 'Moderate' 
     when (`s2`.`SEVERITYLEVEL` = 4) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 5) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 6) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 7) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 8) then 'Critical' 
     when (`s2`.`SEVERITYLEVEL` = 9) then 'Critical' 
     when (`s2`.`SEVERITYLEVEL` = 10) then 'Critical' 
     when (`s2`.`SEVERITYLEVEL` = 10) then 'Critical' end) 
     AS `SEVERITYLEVEL`,count(0) AS `total` 
    
     from `s2` 
     group by (case when (`s2`.`SEVERITYLEVEL` = 1) then 'Moderate' 
     when (`s2`.`SEVERITYLEVEL` = 2) then 'Moderate' 
     when (`s2`.`SEVERITYLEVEL` = 3) then 'Moderate' 
     when (`s2`.`SEVERITYLEVEL` = 4) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 5) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 6) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 7) then 'Severe' 
     when (`s2`.`SEVERITYLEVEL` = 8) then 'Critical' 
     when (`s2`.`SEVERITYLEVEL` = 9) then 'Critical' 
     when (`s2`.`SEVERITYLEVEL` = 10) then 'Critical' end) 
     order by count(0) desc limit 10
    

    我让表在第2/3列(严重级别+总数)中正常工作。 但是我怎样才能添加客户端呢?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    您需要添加 name . 查询可以简化为:

    select name,
          (case when s2.SEVERITYLEVEL in (1, 2, 3) then 'Moderate' 
                when s2.SEVERITYLEVEL in (4, 5, 6, 7) then 'Severe' 
                when s2.SEVERITYLEVEL in (8, 9, 10) then 'Severe' 
           end) as severity,
          count(*) as total 
    from s2
    group by name, severity
    order by count(*) desc
    limit 10;
    

    笔记:

    • mysql允许您在 group by . 这是一个很大的便利。
    • 给新的列名一个新名称。这通常是保持事情不含糊的好建议。
    • 多余的backticks只会使查询更难写入和读取。没什么害处,但何必麻烦呢?
    • 我理解 count(1) 但是 count(0) 只是看起来很困惑,尤其是对于经验不足的人。 count(*) 是用于计算行数的SQL标准构造。
        2
  •  1
  •   Alex    7 年前

    我强烈建议把你的严重性放在单独的桌子上。这将有助于避免将来的许多复杂性,并使许多查询更具性能。

    http://sqlfiddle.com/#!9/9f25cf/3

    SELECT client, title, sum(total)
    FROM s2 
    LEFT JOIN severity
    ON s2.severitylevel = severity.id
    GROUP BY client, title