SQL 函数在 SELECT 子句中的计数(用百分比说明)
SQL function count in SELECT clause (clarifications with percentage)
我有一个 table 这样的:
--------------------------------------------------------------
- employee_id - level - study_environment - work_environment -
--------------------------------------------------------------
-- values... --
--------------------------------------------------------------
我的要求是找到两个值:
员工总数(employee_id
为主键)
level
junior
或 senior
的员工百分比(level
的可能值: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
子句中,但我无法弄清楚。
这是使用 sum
和 case
的条件聚合的一种选择:
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,因此求和不正确。
您可以在一个 CASE .... WHEN 语句中使用多个条件来执行适当的 counting/calculating:
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;
这个和另一个答案类似,但是计算整个table的总和(即每个员工都被统计),而不是只统计那些满足WHERE子句中设置条件的记录,这是(我认为)你想要的。
SQLFiddle: http://sqlfiddle.com/#!9/5feb0/21
(注意:为方便起见,我缩短了列名,但意图应该很清楚。)
更一般地说,如果你想要工作=学习(但不一定'law'):
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(测试数据略有不同)
我有一个 table 这样的:
--------------------------------------------------------------
- employee_id - level - study_environment - work_environment -
--------------------------------------------------------------
-- values... --
--------------------------------------------------------------
我的要求是找到两个值:
员工总数(
employee_id
为主键)level
junior
或senior
的员工百分比(level
的可能值: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
子句中,但我无法弄清楚。
这是使用 sum
和 case
的条件聚合的一种选择:
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,因此求和不正确。
您可以在一个 CASE .... WHEN 语句中使用多个条件来执行适当的 counting/calculating:
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;
这个和另一个答案类似,但是计算整个table的总和(即每个员工都被统计),而不是只统计那些满足WHERE子句中设置条件的记录,这是(我认为)你想要的。
SQLFiddle: http://sqlfiddle.com/#!9/5feb0/21
(注意:为方便起见,我缩短了列名,但意图应该很清楚。)
更一般地说,如果你想要工作=学习(但不一定'law'):
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(测试数据略有不同)