【问题标题】:SQL function count in SELECT clause (clarifications with percentage)SELECT 子句中的 SQL 函数计数(百分比说明)
【发布时间】:2016-02-19 00:18:38
【问题描述】:

我有一张这样的桌子:

    --------------------------------------------------------------
    - employee_id - level - study_environment - work_environment -                     
    --------------------------------------------------------------
    --                         values...                        --
    --------------------------------------------------------------

我的要求是找到两个值:

  • 员工总数(employee_id 为主键)。

  • leveljuniorseniorlevel 的可能值:NULL, apprentice, junior, senior)以及在相同选择的环境中学习和工作的员工的百分比。

我的实际查询是:

SELECT count(employee_id) AS quantity, ((count(level = 'junior' OR level = 'senior') * 100) / count(employee_id)) AS percentage
FROM table 
WHERE study_environment = 'law'
AND work_environment = 'law'

它没有按预期工作,我几乎可以确定错误出现在 SELECT 子句中,但我无法弄清楚。

【问题讨论】:

  • OR tipo='senior' - 错字?
  • 这是一个错字但只在这里,谢谢我现在编辑

标签: mysql sql select count percentage


【解决方案1】:

这是使用sumcase 的条件聚合的一个选项:

select count(*) overallcount,
      100 * sum(case when level in ('junior','senior') then 1 else 0 end) / count(*)
FROM table 
WHERE study_environment = 'law'
      AND work_environment = 'law'

true 或 false 的计数仍为 1,因此求和不正确。

【讨论】:

    【解决方案2】:

    您可以在 CASE .... WHEN 语句中使用多个条件来进行适当的计数/计算:

    SELECT count(*) AS total,
        (100*SUM(CASE WHEN (level = 'junior' OR level = 'senior') 
                 AND work = 'law' AND study = 'law'
                 THEN 1 ELSE 0 END))/count(*) AS percentage
    FROM employee;
    

    这与另一个答案类似,但计算的是整个表的总数(即每个员工都被计算在内),而不是只计算那些满足 WHERE 子句中设置的条件的记录,这是(我认为)什么你想要的。

    SQLFiddle:http://sqlfiddle.com/#!9/5feb0/21

    (注意:为方便起见,我缩短了列名,但意图应该很清楚。)

    更笼统地说,如果你想要工作 = 学习(但不一定是“法律”):

    SELECT count(*) AS total,
        (100*SUM(CASE WHEN (level = 'junior' OR level = 'senior') 
                 AND work = study
                 THEN 1 ELSE 0 END))/count(*) AS percentage
    FROM employee;
    

    http://sqlfiddle.com/#!9/18960a/1(测试数据略有不同)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      相关资源
      最近更新 更多