2013-03-27 22 views
0

使用你們作爲一個傳聲筒真的,但這裏是我的情況計數比較,其中一些字符是數字

我試圖找出如何創建一個精確的計數僱員表,根據關員工數量(Num字段),其中一些員工號碼中有字母。

詳細信息: 四家公司,合併約2年前。主公司一直使用純數字作爲員工編號。第一個子公司用來使用字母和數字,現在已經切換到所有的數字,但老員工的記錄仍然有字母。 (其他子公司在同一張表中,但對於本報告而言它們無關緊要)

00000-55555的所有員工記錄均爲主公司,55556-88888第一子公司。此外,任何帶有英文字母的員工編號也是First Sub Company的一部分。

我知道如何純粹爲數字範圍製作個案陳述,但僱員號碼的Letter部分正在拋棄我。

我不確定如何爲兩家公司創建準確的員工數量。與那些存在以及

+0

哪裏非數值員工編號存儲時,如果eomployee 2-14是一個數字字段? – 2013-03-27 15:30:29

回答

0

像這樣的東西應該工作(如果我的你的處境的理解是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 
+0

這一枚被撞出來了,謝謝! – user1949329 2013-03-27 16:12:09

+0

不客氣。我將不勝感激標記爲答覆和upvote;) – Moho 2013-03-27 16:49:13

+0

我標記了答案,但無法upvote。我還沒有足夠的聲望 – user1949329 2013-03-27 20:32:29

0

如果您是在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與表的名稱。

這將輸出一個包含公司列(First Sub Company或Main Company)的表格,後面跟着屬於每個公司的員工數量。

+0

基本上,我可能會選擇這種方法。不過,我可以在這個特定的查詢中看到兩個問題。 #1)ISNUMERIC測試方法通常不可靠,可能會給這個特定問題帶來誤報。例如,'1E1'會產生'true'。我可能會使用'LIKE'%[a-z]%''或者'NOT LIKE'%[^ 0-9]%''來代替。 #2)您可能需要規定,如果該數字不低於55556,則仍不應超過88888,以符合第一個子公司的條件。 (即一個簡單的ELSE可能不夠。) – 2013-03-29 19:35:53

0

假設的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