把你们当做传声筒,但这是我的情况
我正在尝试弄清楚如何根据员工编号(Num字段)为员工表创建准确的计数,其中一些员工编号中包含字母。
细节:四家公司,大约两年前合并。主公司一直使用纯数字作为员工编号。First Sub Company过去使用字母和数字,现在已全部转换为数字,但较旧的员工记录仍然使用字母。(其他子公司在同一张表中,但就本报告而言,它们无关紧要)
00000-55555年度所有员工记录均为主单位,55556-88888年度为第一子单位。此外,任何带有字母的员工编号也是第一子公司的一部分。
我知道如何纯粹地为数字范围编写case语句,但是员工数字的字母部分让我感到困惑。
我不知道如何准确地计算出这两家公司的雇员人数。这些也是存在的
发布于 2013-03-27 23:30:21
这样的东西应该可以工作(如果我对你的情况的理解是correc的话):
SELECT
SUM( IsFirstSubCompany ) FirstSubCompanyEmployeeCount
, SUM( IsMainCompany ) MainCompanyEmployeeCount
FROM
(
SELECT
IsFirstSubCompany = CASE
WHEN u.Num LIKE '%[a-z]%' OR ( 1 = ISNUMERIC( u.Num ) AND CONVERT( INT, u.Num ) BETWEEN 55556 AND 88888 ) THEN 1 ELSE 0
END,
IsMainCompany = CASE
WHEN 1 = ISNUMERIC( u.Num ) AND CONVERT( int, u.Num ) BETWEEN 00000 and 55555 THEN 1 ELSE 0
END
FROM
UserTable u
) q发布于 2013-03-27 23:30:46
如果您使用的是SQL Server (您在帖子中没有提到您的RDBMS ),您可以使用以下方法来实现您正在寻找的目标:
SELECT Company,
COUNT(*) AS NoOfEmployees
FROM
(
SELECT CASE ISNUMERIC(EmployeeNo)
WHEN 1 THEN
CASE
WHEN (EmployeeNo < 55556) THEN 'Main Company'
ELSE 'First Sub Company'
END
ELSE 'First Sub Company'
END AS Company
FROM [table]
) a
GROUP BY Company记住将EmployeeNo替换为您的员工编号列的实际名称,将table替换为您的表的名称。
这将输出一个表,其中包含一个Company列(First Sub Company或Main Company),后跟属于每个列的员工数量。
发布于 2013-03-27 23:34:59
假设使用SQLServer,请尝试:
with cte as
(select
case when convert(numeric,
case isnumeric(employee_no) when 1 then employee_no else '99999' end)
between 0 and 55555 then 'Main' else 'Sub' end co
from employee)
select co, count(*) from cte group by co(SQLFiddle here)
https://stackoverflow.com/questions/15662468
复制相似问题