2013-03-08 31 views
0

我是新來的sql,我有這樣的SQL - 讓員工的數量每級以特定格式

 
Emp_id | Emp_NAME | EMP_GRADE 
    1   Test1  A1 
    2   Test2  A2 
    3   Test3  A3 
    4   Test4  A4 
    6   Test5  A1 
    7   Test6  A2 
    8   Test7  A3 

一個表,我需要得到每個年級僱員的數量,在(A2) - A2(2) - A3(2)-A4(1)中每個職位的員工數量,最終輸出爲 「2-2-2-1」 )。任何人都可以給這個sql查詢。我希望我們不需要光標。

+0

這是SQL Server還是Oracle? – 2013-03-08 06:06:41

+0

SQL Server 2008 – premeclat 2013-03-08 06:08:33

+0

coalesce將爲您工作。見下面的答案。 – 2013-03-08 06:14:57

回答

0

用途:

DECLARE @Grades varchar(1000) 

    SELECT @Grades=coalesce(@Grades + ' ','') +Cast(COUNT(EMP_GRADE) as Varchar(2))+' -' From TableName 
    Group By EMP_GRADE 

    Select @Grades=SUBSTRING(@Grades,0,LEN(@Grades)) 
    Select @Grades 

更新:

SELECT @Grades=coalesce(@Grades + ' ','') +Cast(COUNT(t1.EMP_GRADE) as Varchar(2))+' -' From @tab1 t 
Left Join @tab1 t1 On t1.EMP_GRADE= t.EMP_GRADE And t1.Emp_id= t.Emp_id 
And t1.EMP_GRADE<>'A3' -- Replace conditions here 
Group By t1.EMP_GRADE,t.EMP_GRADE 
+0

感謝您的快速回復。我想要「2 - 2 - 2 - 1」而不是「T1(2) - T2(2) - T3(2) - T4(1)」 – premeclat 2013-03-08 06:19:13

+0

回答更新。 – 2013-03-08 06:20:54

+0

非常感謝克拉克..正在工作。有這個問題..如果我過濾一些條件說我有員工代碼是獨特的,沒有任何A3級。如果我使用這個查詢,它應該返回「2-2-0-1」,其中「0」表示當前選擇沒有等級 – premeclat 2013-03-08 06:39:13

0
SELECT STUFF((
    SELECT ' - ' + CAST(COUNT(1) AS VARCHAR(max)) 
    FROM myTable 
    GROUP BY EMP_GRADE 
    ORDER BY EMP_GRADE 
    FOR XML PATH('') 
), 1, 3, '') 

SQL Fiddle example


如果你過濾但仍希望爲每個年級返回結果,則需要自連接來獲得成績的完整列表。這裏有一種方法:

;WITH g AS (SELECT DISTINCT EMP_GRADE FROM myTable) 
SELECT STUFF((
    SELECT ' - ' + CAST(COUNT(t.Emp_id) AS VARCHAR(max)) 
    FROM g 
    LEFT OUTER JOIN myTable t ON g.EMP_GRADE = t.EMP_GRADE 
     AND t.Emp_id % 2 = 1 --put your filter conditions here as part of the join 
    GROUP BY g.EMP_GRADE 
    ORDER BY g.EMP_GRADE 
    FOR XML PATH('') 
), 1, 3, '') 

SQL Fiddle example

+0

正是我所需要的。有這個問題..如果我過濾一些條件說我有員工代碼是獨特的,沒有任何A3級。如果我使用這個查詢,它應該返回「2-2-0-1」,其中「0」表示當前選擇沒有等級 – premeclat 2013-03-08 06:25:50

+0

@premeclat好吧,我已經添加了一個如何做到這一點的例子。這假定你沒有單獨的'Grades'表。如果你這樣做了,你可以選擇那個而不是'g'。 – 2013-03-08 06:49:54

1
SELECT COUNT(Emp_id) FROM myTableName GROUP BY EMP_GRADE 
0

這應該工作:

SELECT EMP_GRADE, COUNT(EMP_Id) AS EMPS_COUNT 
FROM TableName 
GROUP BY EMP_GRADE 

希望有所幫助。繼續學習SQL。